1 Introduction

This analysis notebook accompanies the paper Using wearable biosensors and ecological momentary assessments for the detection of prolonged stress in real life by Tutunji et al. 2021, and utilizes data from the study “Stress Reslience and the Brain in Medical Students (STRAIN-MD)”. Study design details can be founed in the original article, but a brief summary is provided here to assist in reading comprehension. In this study, participants completed two weeks of Ecological Momentary Asessments (EMA/ESM) coupled with Ecological Physiological Assessments (EPA). One of these weeks culminated in a high-stakes exam, while the other was outside of examination periods thus providing a stress and control week respectively. EMA consisted of questions regarding subjective stress, and positive and negative affect. EPA within the context of this study consisted of a wearable device that collected continuous measures of physiological arousal. Using these measures, we first validate our stress exposure by examining changes in subjective stress ratings between the two week. We then demonstrate the impact of stress exposure on mood and arousal measures. We then explore our findings by looking at continuous associations between subjective stress and outcomes. Finally, we demonstrate the feasibility of Mood and EPA measures in prediction of stress and control weeks using machine learning models.

All custom functions and code can be found in associated GitHub directory. Libraries used listed at the end of the document. In addition to the libraries, we also used prespecified themes for ggplots that make some plots easier to draw. These are all run in the set-up chunks.

In addition to the libraries, we also used prespecified themes for ggplots that make some plots easier to draw.

# Theme 1
ggtheme <- theme (text=element_text(size=16,  family="Cambria"),
                  legend.position = "none",
                  axis.text.y = element_blank(),axis.text.x = element_text(size=16),
                  axis.ticks.y = element_blank(),
                  plot.title = element_text(size=16, hjust=0.5),
                  panel.background = element_rect(fill="transparent"),
                  panel.grid.minor.y = element_line(size=3),
                  panel.grid.major = element_line(colour = "aliceblue") )
# Theme 2
ptheme <- theme(text=element_text(size=11,  family="Calibri"), 
          axis.line = element_line(size = 1, colour = "grey"),
          panel.background = element_rect(fill="transparent"),
    plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
        panel.grid.minor.y = element_line(colour="grey95"),
        panel.grid.major.y = element_line(colour = "grey95")) 
  
# Set number of cores
NoCores <- as.numeric(availableCores())-1
  

Before starting, we also load the custom functions generated.

source("functions.R")

2 Data

We first load in the descriptive file here, and perfrom some cleaning to make the file more human friendly. The descriptive information is stored in a different file than the EMA information to avoid linking the any potential identifying information to the actual data. This section is redacted from the public documentation for this reason.

# Get descritpive stats
EMA_descr <- read.delim("../data/descriptives.txt")
# Cleanup
EMA_descr$castor_record_id <- EMA_descr$Subject_ID
EMA_descr$Sex[EMA_descr$Contraceptive_use=="Male"] <- "Male"
EMA_descr$Sex[EMA_descr$Contraceptive_use!="Male"] <- "Female"
# Recode weeks and first scan as factor
EMA_descr$First_Week[EMA_descr$Column1 > 0] <- "Exam-First"
EMA_descr$First_Week[EMA_descr$Column1 < 0] <- "Control-First"
# Recode first scan
EMA_descr$First_Scan_Num <- EMA_descr$First_Scan
EMA_descr$First_Scan[EMA_descr$First_Scan_Num < 0] <- "Stress-First"
EMA_descr$First_Scan[EMA_descr$First_Scan_Num > 0] <- "Control-First"

Using python, we derived physiological features in 10-minute time windows prior to each EMA survey from the raw EPA data for each participant. Preprocessing is done through python with the pyphysio package which has some tools for processing biosignals. EMA data is not processed during this phase and the raw output from the surveys is loaded into R. Among other things, the EMA and EPA signals contain the following features:

  • Event Related Stress
  • Activity Related Stress
  • Physical Stress
  • Social Stress
  • Mood (Positive and Negative)
  • Heart rate (High/Low Frequencey, RMSSD, IBI…)
  • Skin Conductance (Phasic, Tonic, Magnitude…)
  • Skin Temperature (Slope, Mean)
  • Accelorometer Data (delta ACC, mean X,Y,Z direction)

We then load this file, and recode some variables and perfrom some specific cleaning steps.

# Read Data
EMA_Data <- read.csv("../data/EMA_Clean_Features_10min.csv") 
# Precleaning
#First change types incase of improper input
EMA_Data %>% retype
# Some precleaning for variable generations
EMA_Data$obs <- as.numeric(EMA_Data$survey_package_name)
EMA_Data <- separate(EMA_Data, 'survey_package_name', c('ema_day','ema_beep'), sep = -1, remove=F)
EMA_Data$ema_beep_f <- as.factor(EMA_Data$ema_beep)
EMA_Data$ema_beep <- as.numeric(EMA_Data$ema_beep)
EMA_Data$ema_day <- as.factor(EMA_Data$ema_day)
EMA_Data$ema_day_num <- as.numeric(EMA_Data$ema_day)
EMA_Data$Sub_nr_week <-  with(EMA_Data, interaction(castor_record_id, week_type))
EMA_Data$ema_survey <- as.numeric(EMA_Data$survey_package_name)
# Merge with descriptive and remove dropouts from both dataframes
EMA_Data <- merge(EMA_Data, EMA_descr, by='castor_record_id')
EMA_Data <- filter(EMA_Data, EMA_Data$Wave != 0)
EMA_descr <- filter(EMA_descr, EMA_descr$Wave != 0)
EMA_Data$First_Week <- as.factor(EMA_Data$First_Week)
# Keep only distict
EMA_Data <- EMA_Data %>% distinct(Sub_nr_week, obs, .keep_all=T)
EMA_Data$week_type <- EMA_Data$week_type
EMA_Data$Week_Type <- factor(EMA_Data$week_type, levels=c('1','2'),
                         labels=c('Control','Stress'))

2.1 Scoring variables

Before analyzing the data, still need to do some processing to standardize the variables to fit them to mixed models. As such, we process the questionnaire data and the EPA data below.

2.1.1 EMA Variables

For each of the EMA scales, we transform some of the items, rescaled them, and then sum them. This varries for each catrogory of quesitons.

Positive Affect

Positive affect is on of our outcome measures. For positive affect (PA), we first rescale the variables from -3 to 3 into 1-7. The sums of the score is overall reported PA.

## Positive: Rescale from -3-3 to 1 -7
EMA_Data$ema_happy <- (EMA_Data$ema_happy+4)
EMA_Data$ema_relax <- (EMA_Data$ema_relax+4)
EMA_Data$ema_cheer <- (EMA_Data$ema_cheer+4)
EMA_Data$ema_satisfied <- (EMA_Data$ema_satisfied+4)
#Total
EMA_Data$mood_positive <- rowSums(EMA_Data[,c("ema_happy","ema_relax","ema_cheer", "ema_satisfied")])

Negative Affect

Simialr to PA, we do the same here for negative affect. We rescale the individual items, sum for total.

## Negative: Rescale
EMA_Data$ema_down <- (EMA_Data$ema_down+4)
EMA_Data$ema_guilty <-(EMA_Data$ema_guilty+4)
EMA_Data$ema_insecure <- (EMA_Data$ema_insecure+4)
EMA_Data$ema_lonely <- (EMA_Data$ema_lonely+4)
EMA_Data$ema_anxious <- (EMA_Data$ema_anxious+4)
# Total: Sum of measures
EMA_Data$mood_negative <- rowSums(EMA_Data[,c("ema_down","ema_guilty","ema_insecure","ema_lonely","ema_anxious")])

Event Stress

Event related stress questions relate to most prominent event since last beep. For the items ranking the pleasantness, controlability, and expectedness, we need to reverse the score so that less positive events contribute more to the total. It is also scaled -3 to 3, with higher score being better.I will reverse scale the items. So if an event is more pleasant, the event stress score goes down for example. Event importance is just rescaled to 1-7.

# Reverse scale the pleasantness
 EMA_Data$event_pleasant <- (EMA_Data$event_pleasant+4)
EMA_Data$event_pleasant <- (8-EMA_Data$event_pleasant)
EMA_Data$event_pleasant <- (EMA_Data$event_pleasant-4)
# Importance rescaled 1-7
EMA_Data$event_importance <- (EMA_Data$event_importance+4)
# Reverse score Controlability
EMA_Data$event_control <- (EMA_Data$event_control+4)
EMA_Data$event_control <- (8-EMA_Data$event_control)
EMA_Data$event_control <- (EMA_Data$event_control-4)
# Reverse score Expectedness
EMA_Data$event_expect<-(EMA_Data$event_expect+4)
EMA_Data$event_expect<-(8-EMA_Data$event_expect)
EMA_Data$event_expect<-(EMA_Data$event_expect-4)
# Sum for Total
EMA_Data$event_tot <- rowSums(EMA_Data[,c ("event_pleasant","event_importance","event_control","event_expect")])

Activtiy Stress

Activity related stress retains to the activity participants are currently doing right before the beep. The skilled and preference measure are also reversed. More skilled=Lower score. Same with preference.

# Rever Skillfullness
EMA_Data$activity_skill<-(EMA_Data$activity_skill+4)
EMA_Data$activity_skill<-(8-EMA_Data$activity_skill)
EMA_Data$activity_skill<-(EMA_Data$activity_skill-4) 
# Rescaled preference 1-7
EMA_Data$activity_preference<-(EMA_Data$activity_preference+4)
# Rescaled preference 1-7
EMA_Data$activity_effort<-(EMA_Data$activity_effort+4)
# Sum for total
EMA_Data$activity_tot<-rowSums(EMA_Data[,c("activity_skill", "activity_preference", "activity_effort")])

Social Stress

Social stress items relate to the social situation participants are in. There are two branches: Either you are alone, or you are with someone. Both these branches will contribute to the total score. Some measures are reveresed, and some are just brought into the positive. We again get the sum score, ignoring the NaNs since questions are dependant on branch.

# Rescale if they want to be alone or with someone 1-7
EMA_Data$social_alone<-(EMA_Data$social_alone +4)
EMA_Data$social_with <- (EMA_Data$social_with+4)
# Reverse the pleasantness scale
EMA_Data$social_pleasant <- (EMA_Data$social_pleasant + 4)
EMA_Data$social_pleasant <- (8-EMA_Data$social_pleasant)
# Reverse the at ease scale
EMA_Data$social_ease<- (EMA_Data$social_ease + 4)
EMA_Data$social_ease<- (8-EMA_Data$social_ease)
# Reverse the self scale
EMA_Data$social_self<- (EMA_Data$social_self + 4)
EMA_Data$social_self<- (8-EMA_Data$social_self)
# Reverse the at ease alone scale
EMA_Data$social_alone_ease<-(EMA_Data$social_alone_ease +4)
EMA_Data$social_alone_ease<- (8-EMA_Data$social_alone_ease)
#Total. Make sure that nans are not dropped because in the event they are alone, the social items are different
EMA_Data$social_tot<-rowSums(EMA_Data[,c ("social_alone","social_with","social_pleasant","social_ease", "social_self", "social_alone_ease")], na.rm=TRUE)

Physical Stress

Items relate to physical experiences of discomfort. These are control items. We do similar steps as before. We bring to scores from (-3 > 3) to (1 > 7) scaling, and get a sum score. We then just get the sum score for this. In this section we also rescale the excercise items which we use as covariates later

#First recode
EMA_Data$physical_tired<-(4+EMA_Data$physical_tired)
EMA_Data$physical_well<-(4+EMA_Data$physical_well)
EMA_Data$physical_pain<- (4+EMA_Data$physical_pain)
EMA_Data$physical_hunger<- (4+EMA_Data$physical_hunger)
EMA_Data$physical_temp<- (4+EMA_Data$physical_temp)
#Total
EMA_Data$physical_tot<-rowSums(EMA_Data[,c("physical_tired","physical_well","physical_pain", "physical_hunger","physical_temp")])
# Also while Im here I do the excercise Items
EMA_Data$event_duration[is.na(EMA_Data$event_duration)] <- 0
EMA_Data$physical_excercise_dur <-((EMA_Data$event_duration))/max(EMA_Data$event_duration)

Center, scale, and lag

Next we center the variables, rescale them, and also lag them (temporal lagging -1). This is done as a loop for each of the summed items.

# Variables to rescale
rescale_ema <- c("mood_positive", "mood_negative", "event_tot", "activity_tot", "social_tot", "physical_tot", "physical_excercise_dur")
# Rescaling
for (i in rescale_ema){
    #Subject Mean centering
    cen <- paste(i, "c", sep="_")
    EMA_Data[cen] <- calc.mcent(x=EMA_Data[[i]], id=castor_record_id, data=EMA_Data)
    # Z-Transform
    ztrans <- paste(i, "z", sep="_")
    EMA_Data[ztrans] <- scale(EMA_Data[[i]], center = TRUE, scale = TRUE)
    # Rescale
    stran <- paste(i, "s", sep="_")
    EMA_Data[stran] <- scales::rescale(EMA_Data[[ztrans]], to=c(1, 10))
    # Get Mean
    smean <- paste(i, "m", sep="_")
    EMA_Data[smean] <- calc.mean(EMA_Data[[i]], id=Sub_nr_week, data=EMA_Data, expand=TRUE)
    # Z-Transom mean 
    mztrans <- paste(i, "mz", sep="_")
    EMA_Data[mztrans] <- scale(EMA_Data[[smean]], center = TRUE, scale = TRUE)
    # Lag the variable
    lagtrans <- paste(i, "l", sep="_")
    EMA_Data[lagtrans] <- lag_var(x=stran, id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)   
}
# I cant do this in a loop, but I also want to rescale the subject centered values
EMA_Data <-EMA_Data %>% group_by(castor_record_id) %>%
    mutate(mood_positive_cs= scales::rescale(mood_positive_c,to=c(1,10)),
           mood_negative_cs= scales::rescale(mood_negative_c,to=c(1,10)),
           event_tot_cs= scales::rescale(event_tot_c,to=c(1,10)),
           activity_tot_cs= scales::rescale(activity_tot_c,to=c(1,10)),
           social_tot_cs= scales::rescale(social_tot_c,to=c(1,10)),
           physical_tot_cs= scales::rescale(physical_tot_c,to=c(1,10))) %>% ungroup()

Mean Stress

After deriving the rescaled measures, we also calculate the mean stress states which we use for plotting our variables.

##Average stress Measure
EMA_Data$mean_stress <- rowSums(EMA_Data[c('event_tot_z', 'activity_tot_z', 'social_tot_z')], na.rm=TRUE)
EMA_Data$mean_stress_c <- rowSums(EMA_Data[c('event_tot_c', 'activity_tot_c', 'social_tot_c')], na.rm=TRUE)
EMA_Data$mean_stress_s <- scales::rescale(EMA_Data$mean_stress_c, to=c(1, 10))
EMA_Data$mean_stress_l <- lag_var(x="mean_stress_c", id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)

2.1.2 EPA Variables

Now we can clean up some of the physiology data. Since most of the cleaning has already been done in python, only more basic processing is done here. For example, there was one watch that had a faulty temperature sensor. To avoid losing data for a variable in our covariates only, we replace this with values from the mean and standard deviation of the population instead.

# Count of replaced entries
n_temp <- count(EMA_Data$temp_mean > 50)
n_replace <- n_temp$freq[2]
# Subset dataframe with normal values
temp_df <- EMA_Data
temp_df <- filter(temp_df, temp_df$temp_mean < 50)
# Convert mean nans to 0 to apply condition replacement
EMA_Data$temp_mean[is.na(EMA_Data$temp_mean)] <- 0
# Loop over temperature values for replacement
temp_variables <- list("temp_median", "temp_sd", "temp_slope", "temp_mean")
for (i in temp_variables){
    # Get the mean and SD to replace values 
    mean_t <- mean((temp_df[[i]]), na.rm=T)
    sd_t<- sd((temp_df[[i]]),na.rm=T)
    # Replace Mean Temp with distribution
    temp_vect <- runif(n=n_replace, min = (mean_t-sd_t), max =(mean_t+sd_t)) # Vector for replacements
    EMA_Data[i] <- replace(EMA_Data[[i]], (EMA_Data$temp_mean>50), temp_vect)
}
# Revert 0 to NAN
EMA_Data$temp_mean[EMA_Data$temp_mean==0] <- NA

Second, in the python script, if no skin coductance responses are detected, our pipeline returns NaNs. This is not an adequate representation of the data, and as such, we replace periods where signal was detected, but no responses were detected with 0.

EMA_Data$sc_phasic_dur[(!is.na(EMA_Data$sc_tonic_mean)) & (is.na(EMA_Data$sc_phasic_dur))] <- 0
EMA_Data$sc_phasic_num[(!is.na(EMA_Data$sc_tonic_mean)) & (is.na(EMA_Data$sc_phasic_num))] <- 0
EMA_Data$sc_phasic_mag[(!is.na(EMA_Data$sc_tonic_mean)) & (is.na(EMA_Data$sc_phasic_mag))] <- 0

We will finally subject center, rescale, and mean center the EPA data simalr to the EMA data. We do this for each of our measures below.

Heart Rate

# Variables to rescale
rescale_phy <- c("hr_mean", "hr_sd", "hr_min", "hr_max", "ibi_mean", "ibi_sd")
# Rescaling
for (i in rescale_phy){
    #Subject Mean centering
    cen <- paste(i, "c", sep="_")
    EMA_Data[cen] <- calc.mcent(x=EMA_Data[[i]], id=castor_record_id, data=EMA_Data)
    # Z-Transform
    ztrans <- paste(i, "z", sep="_")
    EMA_Data[ztrans] <- scale(EMA_Data[[i]], center = TRUE, scale = TRUE)
    # Rescale
    stran <- paste(i, "s", sep="_")
    EMA_Data[stran] <- scales::rescale(EMA_Data[[ztrans]], to=c(1, 10))
    # Get Mean
    smean <- paste(i, "m", sep="_")
    EMA_Data[smean] <- calc.mean(EMA_Data[[i]], id=Sub_nr_week, data=EMA_Data, expand=TRUE)
    # Z-Transom mean 
    mztrans <- paste(i, "mz", sep="_")
    EMA_Data[mztrans] <- scale(EMA_Data[[smean]], center = TRUE, scale = TRUE)
    # Lag the variable
    lagtrans <- paste(i, "l", sep="_")
    EMA_Data[lagtrans] <- lag_var(x=stran, id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)   
}
# Now to get cs values
EMA_Data <-EMA_Data %>% group_by(castor_record_id) %>%
    mutate(hr_mean_cs= scales::rescale(hr_mean_c,to=c(1,10)),
           hr_min_cs= scales::rescale(hr_min_c,to=c(1,10)),
           hr_max_cs= scales::rescale(hr_max_c,to=c(1,10))) %>% ungroup()
no non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf

Skin Conductance


# Variables to rescale
rescale_phy <- c("sc_tonic_mean", "sc_phasic_mean", "sc_phasic_mag" , "sc_phasic_dur", "sc_phasic_num", "sc_phasic_auc")

# Rescaling
for (i in rescale_phy){
    #Subject Mean centering
    cen <- paste(i, "c", sep="_")
    EMA_Data[cen] <- calc.mcent(x=EMA_Data[[i]], id=castor_record_id, data=EMA_Data)
    # Z-Transform
    ztrans <- paste(i, "z", sep="_")
    EMA_Data[ztrans] <- scale(EMA_Data[[i]], center = TRUE, scale = TRUE)
    # Rescale
    stran <- paste(i, "s", sep="_")
    EMA_Data[stran] <- scales::rescale(EMA_Data[[ztrans]], to=c(1, 10))
    # Get Mean
    smean <- paste(i, "m", sep="_")
    EMA_Data[smean] <- calc.mean(EMA_Data[[i]], id=Sub_nr_week, data=EMA_Data, expand=TRUE)
    # Z-Transom mean 
    mztrans <- paste(i, "mz", sep="_")
    EMA_Data[mztrans] <- scale(EMA_Data[[smean]], center = TRUE, scale = TRUE)
    # Lag the variable
    lagtrans <- paste(i, "l", sep="_")
    EMA_Data[lagtrans] <- lag_var(x=stran, id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)   
}

# Now to get cs values
EMA_Data <-EMA_Data %>% group_by(castor_record_id) %>%
    mutate(sc_tonic_mean_cs= scales::rescale(sc_tonic_mean_c,to=c(1,10)),
           sc_phasic_mag_cs= scales::rescale(sc_phasic_mag_c,to=c(1,10)),
           sc_phasic_dur_cs= scales::rescale(sc_phasic_dur_c,to=c(1,10)),
            sc_phasic_auc_cs= scales::rescale(sc_phasic_auc_c,to=c(1,10)),
            sc_phasic_num_cs= scales::rescale(sc_phasic_num_c,to=c(1,10))) %>% ungroup()

Temperature

# Temp
# Mean
EMA_Data$temp_mean_c <- calc.mcent(temp_mean,Sub_nr_week, data=EMA_Data )
EMA_Data$temp_mean_z <- scale(EMA_Data$temp_mean, center = TRUE, scale = TRUE)
EMA_Data$temp_mean_l <- lag_var(x="temp_mean_z", id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)
# Slope
EMA_Data$temp_slope_c <- calc.mcent(temp_slope,Sub_nr_week, data=EMA_Data )
EMA_Data$temp_slope_z <- scale(EMA_Data$temp_slope, center = TRUE, scale = TRUE)
EMA_Data$temp_slope_l <- lag_var(x="temp_slope_z", id="Sub_nr_week", obs="obs", day= "ema_day_num", data=EMA_Data, lag=1)
# SD
EMA_Data$temp_sd_c <- calc.mcent(temp_sd,Sub_nr_week, data=EMA_Data )
EMA_Data$temp_sd_z <- scale(EMA_Data$temp_sd, center = TRUE, scale = TRUE)

3 Descriptives Stats

Before running any stats, we should take a look at some descriptive stats to get an overall feel of our data. We do this in two parts, looking at the population descriptives, and then the physiology descriptives.

3.1 Compliance Rates

Lets first check compliance rates to see how well our subjects adhered to the sampling scheme. We first check the compliance rates uncorrected for the time at which they were acquired, followed by correction of the time limits. We set this to 1 hour since we only have 6 surveys, and our subjects had varying time schedules.

Uncorrected Compliance

Compliance rates uncorrected for time off-sets

# Recod compliance variable
EMA_Data$completed[EMA_Data$survey_progress==100] <- 1 
# Per subject
calc.nomiss(completed, castor_record_id, data=EMA_Data, prop=T)
  sub_001   sub_002   sub_003   sub_004   sub_005   sub_006   sub_007   sub_008   sub_009   sub_010   sub_011   sub_012   sub_013   sub_014 
0.9759036 0.8902439 0.9259259 0.8148148 0.9259259 1.0000000 0.9518072 0.9135802 0.9880952 0.6125000 1.0000000 0.9756098 0.9880952 0.9756098 
  sub_015   sub_016   sub_017   sub_018   sub_019   sub_020   sub_021   sub_022   sub_023   sub_024   sub_025   sub_026   sub_027   sub_028 
0.6835443 1.0000000 0.8421053 0.7307692 0.9759036 0.9113924 0.8734177 0.9113924 0.9759036 0.9879518 0.9487179 0.9878049 0.9500000 0.9753086 
  sub_029   sub_030   sub_031   sub_032   sub_033   sub_034   sub_035   sub_036   sub_037   sub_038   sub_039   sub_040   sub_043   sub_044 
0.9240506 0.9480519 0.8271605 0.7887324 0.9210526 0.9240506 0.9382716 0.9375000 0.9743590 0.6562500 0.9878049 0.9506173 0.9638554 0.9518072 
  sub_045   sub_046   sub_047   sub_048   sub_050   sub_052   sub_053   sub_054   sub_057   sub_058   sub_059   sub_060   sub_061   sub_062 
0.9166667 0.9634146 0.9382716 0.8795181 0.9350649 0.9500000 0.8974359 0.9390244 0.9375000 0.9506173 0.9629630 0.9500000 1.0000000 1.0000000 
  sub_063   sub_064   sub_065   sub_066   sub_067   sub_068   sub_069   sub_070   sub_071   sub_072   sub_073   sub_074   sub_075   sub_076 
0.8947368 0.9634146 0.9880952 0.9759036 1.0000000 0.9761905 0.8028169 0.9367089 0.9625000 0.9125000 0.9350649        NA 0.9761905 0.9879518 
  sub_077   sub_078   sub_081   sub_082   sub_083   sub_084   sub_085   sub_086   sub_087   sub_088   sub_089   sub_105   sub_115   sub_141 
0.9518072 1.0000000 0.9880952 0.8780488 0.8170732 0.8571429        NA        NA        NA        NA        NA 0.7230769 1.0000000 0.9880952 
  sub_142   sub_149   sub_151   sub_153   sub_155   sub_156   sub_161 
0.9629630 0.9200000 1.0000000        NA 0.8400000 0.9200000        NA 
# more summary statistics for compliance
summary(calc.nomiss(completed, castor_record_id, data=EMA_Data, prop=TRUE))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.6125  0.9119  0.9500  0.9249  0.9759  1.0000       8 

Without correcting for time offsets, our EMA measures seem to be nice. Lets see if I correct for timing if it makes a difference next what will happen. We will give participant one hour to finish the survey. If they don’t finish it in that time window, we will count it as missing.

Corrected Compliance

Compliance rates correcting for time of completion. First drop any survey that is not complete more than 80%. I then create a variable that tells as when the survey was completed in terms of time (not date). I then conditionally set the completion variable to zero if the survey does not fall within the completed time window given the beep.

# Set up some stuff for replace and refill
EMA_Data$survey_completed_on <- as.character(EMA_Data$survey_completed_on)
EMA_Data$survey_completed_time <- as.ITime(EMA_Data$survey_completed_on)
EMA_Data$completed[EMA_Data$survey_progress < 80] <- 0 
# Replace and refill conditionals for completion, factoring times
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("10:30:00")) & EMA_Data$ema_beep==1] <- 0
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("13:00:00")) & EMA_Data$ema_beep==2] <- 0
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("15:30:00")) & EMA_Data$ema_beep==3] <- 0
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("18:00:00")) & EMA_Data$ema_beep==4] <- 0
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("20:30:00")) & EMA_Data$ema_beep==5] <- 0
EMA_Data$completed[EMA_Data$survey_completed_time >= (as.ITime("23:00:00")) & EMA_Data$ema_beep==6] <- 0
# Reformat 0 to Nan, and get new completion rates
EMA_Data$completed[EMA_Data$completed == 0] <- NA
calc.nomiss(completed, castor_record_id, data=EMA_Data,prop=TRUE)
  sub_001   sub_002   sub_003   sub_004   sub_005   sub_006   sub_007   sub_008   sub_009   sub_010   sub_011   sub_012   sub_013   sub_014 
0.9638554 0.7073171 0.7160494 0.6913580 0.9259259 0.9761905 0.9277108 0.8395062 0.9404762 0.5625000 0.8641975 0.9512195 0.9404762 0.7682927 
  sub_015   sub_016   sub_017   sub_018   sub_019   sub_020   sub_021   sub_022   sub_023   sub_024   sub_025   sub_026   sub_027   sub_028 
0.4050633 0.9404762 0.8421053 0.7051282 0.9277108 0.8734177 0.7721519 0.8101266 0.9638554 0.9879518 0.9487179 0.9756098 0.9375000 0.9506173 
  sub_029   sub_030   sub_031   sub_032   sub_033   sub_034   sub_035   sub_036   sub_037   sub_038   sub_039   sub_040   sub_043   sub_044 
0.9240506 0.9480519 0.8271605 0.7887324 0.8815789 0.8354430 0.9259259 0.9250000 0.9615385 0.4687500 0.8658537 0.9382716 0.9518072 0.9397590 
  sub_045   sub_046   sub_047   sub_048   sub_050   sub_052   sub_053   sub_054   sub_057   sub_058   sub_059   sub_060   sub_061   sub_062 
0.7976190 0.9390244 0.9382716 0.8795181 0.8961039 0.9500000 0.8717949 0.9268293 0.9375000 0.9506173 0.9259259 0.9375000 0.9523810 1.0000000 
  sub_063   sub_064   sub_065   sub_066   sub_067   sub_068   sub_069   sub_070   sub_071   sub_072   sub_073   sub_074   sub_075   sub_076 
0.8815789 0.9146341 0.9166667 0.9397590 0.9285714 0.6428571 0.5492958 0.7721519 0.9125000 0.8500000 0.7922078        NA 0.9404762 0.8915663 
  sub_077   sub_078   sub_081   sub_082   sub_083   sub_084   sub_085   sub_086   sub_087   sub_088   sub_089   sub_105   sub_115   sub_141 
0.9156627 0.8809524 0.9404762 0.8048780 0.7317073 0.8571429        NA        NA        NA        NA        NA 0.7076923 0.8780488 0.8452381 
  sub_142   sub_149   sub_151   sub_153   sub_155   sub_156   sub_161 
0.9629630 0.8400000 0.9642857        NA 0.6133333 0.9200000        NA 
summary(calc.nomiss(completed, castor_record_id, data=EMA_Data,prop=TRUE))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.4051  0.8313  0.9157  0.8638  0.9405  1.0000       8 

Usable Physiology

We also check the completion rates for periods where we have detected usable physiology in our pipeline. We do this by estimating the number of times where we successfully detected skin conductance,

summary(calc.nomiss(sc_tonic_mean, castor_record_id, data=EMA_Data,prop=TRUE))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
 0.0000  0.7037  0.7711  0.7337  0.8373  0.9762       8 

When we correct for the timing, we actually still have decent completion rates. Finally we filter out all incomplete surveys and those outside our time windows for our overall analysis.

EMA_Data <- EMA_Data %>% dplyr::filter(!is.na(completed)) 

3.2 Populations Descriptives

We next take a look at population descriptive that we would like to report.

Sex

describe(EMA_descr$Sex)
EMA_descr$Sex 
       n  missing distinct 
      83        0        2 
                        
Value      Female   Male
Frequency      51     32
Proportion  0.614  0.386

Contraceptive Use

This is interesting for other analyses we want to do with other data

describe(factor(EMA_descr$Contraceptive_use))
factor(EMA_descr$Contraceptive_use) 
       n  missing distinct 
      83        0        4 
                                  
Value          c  Male    No   Yes
Frequency      8    32    19    24
Proportion 0.096 0.386 0.229 0.289

Program

describe((EMA_descr$Program))
(EMA_descr$Program) 
       n  missing distinct 
      83        0        2 
                                
Value      BSc_BioMed    BSc_Med
Frequency          22         61
Proportion      0.265      0.735

First Week

describe(EMA_descr$First_Week)
EMA_descr$First_Week 
       n  missing distinct 
      83        0        2 
                                      
Value      Control-First    Exam-First
Frequency             56            27
Proportion         0.675         0.325

Days Between Weeks

# Number of days between weeks
summary(abs(EMA_descr$Column1))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  10.00   14.00   15.00   15.96   16.00   33.00 

Survey Disruption

Asking whether the surveys disrupted the participants.

psych::describe(EMA_Data$physical_disruption)
ggplot(EMA_Data, aes(x=physical_disruption)) + geom_histogram(bins = 7)

3.3 Physiology Descriptive

After getting the population descriptive, we should next derive some E4 Quality measures. A lot of the data which is poor quality is already removed early on in the preprocessing pipeline. Instead we can check how many recordings were captured for the IBI data, and the overall movement during testing.

IBI Based Quality

This is a measure of what duration of time the detected heart beats cover. So within a 10minute time window, we would want to detect 10 minutes of total IBI time if we had 100% signal. We see that for the mean is 27% of time with beats detected instead. This indicates that we do not have enough data for temporal domain analysis.

ggplot(EMA_Data, aes(x=ibi_based_quality, colour=ibi_based_quality)) + geom_histogram()

count(EMA_Data$ibi_based_quality > 0.3)
psych::describe(EMA_Data$ibi_based_quality)

IBI and ACC

Next we will check if the IBI quality is related to the ACC data. This gives us a good idea of how much motion is affecting our data. We see it has a big impact. When people are not moving, we are able to detect the entire IBI window. This means we should include movement in our models.

ggplot(EMA_Data, aes(x=ibi_based_quality, y=acc_delta)) + geom_smooth(method="lm", fullrange=F ) + coord_cartesian(ylim = c(0,10), xlim=c(0, 2.5))  + ggtheme + theme(axis.ticks.y=element_line(size=1), axis.text.y = element_text(size=12)) + ylab("ACC Delta") + xlab ("IBI Based Quality")

IBI Quality and HR SD

Next, we check if the IBI Quality effects the SD of the HR measures. It looks like it does have an impact, meaning we likely cant use that measure.

ggplot(EMA_Data, aes(x=ibi_based_quality, y=hr_sd)) + geom_smooth(method="lm", fullrange=F ) + ggtheme + theme(axis.ticks.y=element_line(size=1), axis.text.y = element_text(size=12)) + ylab("HR SD") + xlab ("IBI Based Quality")

summary(lm(ibi_based_quality ~ hr_sd, data=EMA_Data))

Call:
lm(formula = ibi_based_quality ~ hr_sd, data = EMA_Data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.42413 -0.16391 -0.05473  0.11399  1.45944 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.4722122  0.0061893    76.3   <2e-16 ***
hr_sd       -0.0239518  0.0006238   -38.4   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2216 on 4417 degrees of freedom
  (1316 observations deleted due to missingness)
Multiple R-squared:  0.2502,    Adjusted R-squared:  0.2501 
F-statistic:  1474 on 1 and 4417 DF,  p-value: < 2.2e-16

SC and ACC

Next we will check if the skin conductance signals are related to the ACC. Basically this is just doing exploratory analysis to double check whether movement also impacts skin conductance measures. We see here that it also does indeed impact our measures.

fig.sc_tonic <- ggplot(EMA_Data, aes(x=sc_tonic_mean, y=acc_delta)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1), axis.text.y = element_text(size=12)) + ylab("ACC Delta") + xlab ("SC Tonic")  
fig.sc_mag <- ggplot(EMA_Data, aes(x=sc_phasic_mag, y=acc_delta)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1)) + xlab ("SC Mag") 
fig.sc_num <- ggplot(EMA_Data, aes(x=sc_phasic_num, y=acc_delta)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1)) + xlab ("SC Num") 
fig.sc_auc <- ggplot(EMA_Data, aes(x=sc_phasic_auc, y=acc_delta)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1)) +  xlab ("SC AUC") 
fig.sc_dur <- ggplot(EMA_Data, aes(x=sc_phasic_dur, y=acc_delta)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1)) + xlab ("SC Dur")  
fig.temp_mean <- ggplot(EMA_Data, aes(x=physical_excercise_dur, y=acc_delta, colour="red")) + geom_smooth(method="lm") + ggtheme 
ggarrange(fig.sc_tonic, fig.sc_mag, fig.sc_num, fig.sc_auc, fig.sc_dur, fig.temp_mean)

SC Mag and number

fig.sc_mag <- ggplot(EMA_Data, aes(x=sc_phasic_mag, y=sc_phasic_num)) + geom_smooth(method="lm", fullrange=F )   + ggtheme + theme(axis.ticks.y=element_line(size=1)) + xlab ("SC Mag") 
fig.sc_mag

3.5 Aggregate Stress

After plotting our variables over all the week, it will be interesting to check the aggregate stress changes, and how each subjects stress reactivity looks like. For this, we make an average dataframe across the weeks, so we can look at the average change in mood.

#Average Stress per Week:
EMA_avg <- EMA_Data
# Now I can do some merging
EMA_avg <- aggregate(EMA_avg, by=list(EMA_avg$castor_record_id, EMA_avg$Week_Type), FUN=mean, na.rm=T, na.warn=F)
EMA_avg$castor_record_id <- EMA_avg$Group.1
EMA_avg$Week_Type <- EMA_avg$Group.2
EMA_avg$Week_Type <- factor(EMA_avg$Week_Type, levels=c('Control','Stress'),
                     labels=c('Control','Exam'))
# Split the averaged DF to control and stress week
EMA_avg_exam <- subset(EMA_avg, Week_Type=="Exam") 
EMA_avg_control <- subset(EMA_avg, Week_Type!="Exam") 
# Merge by week to calculate change
EMA_avg_wide <-  merge(EMA_avg_exam, EMA_avg_control, by='castor_record_id', suffixes=c('_exam', '_control'))
# Make Aggregated variables 
EMA_avg_wide$mood_positive <-((EMA_avg_wide$mood_positive_control + EMA_avg_wide$mood_positive_exam)/2)
EMA_avg_wide$mood_negative <-((EMA_avg_wide$mood_negative_control + EMA_avg_wide$mood_negative_exam)/2)
EMA_avg_wide$activity_tot <-((EMA_avg_wide$activity_tot_control + EMA_avg_wide$activity_tot_exam)/2)
EMA_avg_wide$social_tot <-((EMA_avg_wide$social_tot_control + EMA_avg_wide$social_tot_exam)/2)
EMA_avg_wide$event_tot <-((EMA_avg_wide$event_tot_control + EMA_avg_wide$event_tot_exam)/2)
EMA_avg_wide$physical_tot <-((EMA_avg_wide$physical_tot_control + EMA_avg_wide$physical_tot_exam)/2)
# Make stress change, and mean centrer it
EMA_avg_wide$stress_reactivity <- EMA_avg_wide$mean_stress_exam - EMA_avg_wide$mean_stress_control
EMA_avg_wide$stress_reactivity_c <- EMA_avg_wide$mean_stress_c_exam - EMA_avg_wide$mean_stress_c_control
EMA_avg_wide$stress_reactivity_z <- scale(EMA_avg_wide$stress_reactivity, center = TRUE, scale = TRUE)

Mean Change in Stress

#Box Plot
mean_box <- ggplot(EMA_avg, aes(y=mean_stress, x=Week_Type, colour=Week_Type,fill=Week_Type, na.rm = TRUE)) +
  geom_boxplot(alpha=1/2) + geom_jitter(width=0.1, alpha=1/2)+
  scale_y_continuous()+ scale_x_discrete()+
  ggtitle("Stress Levels per Week")+
  xlab("") + ylab("Aggregated stress measure\n")+ ggtheme
mean_box #+ coord_fixed(ratio=1)

Stress Rectivity Heat Plot

scat_str <- ggplot (EMA_avg_wide, aes(y=stress_reactivity_c, x=0, colour=stress_reactivity_c) ) +
    geom_jitter( width = 0.7, alpha=0.75, size = 2) + scale_x_continuous()+
    ggtitle("Individual Stress Reactivity to Exams\n")+ylab("Stress\nReactivity\n")+labs(color = "Stress\nReactivity\n")+
    theme(text=element_text(size=18,  family="Cambria"),
        plot.title=element_text (size=20, hjust=0.5),
        axis.title.x=element_blank(),axis.text.x=element_blank(),axis.ticks.x=element_blank(),
        axis.text.y = element_text(size=18),axis.title.y=element_text(size=18),
        panel.background = element_rect(fill="white"),
        panel.grid.minor.y = element_line(size=3),
        panel.grid.major = element_line(colour = "aliceblue"))
scat_str + scale_color_gradient(low="blue", high="red") + coord_fixed(xlim = c(-5,5))

4 Inferential Stats

We can now run the actual statistics. We use mixed effects models to first validate our paradigm by looking at overall changes in our subjective stress measures between the two weeks. We then go one to investigate the effects of the stress exposure (i.e., stress week) on our outcomes of affect and arousal. We finally investigate and explore the moment-to-moment associations between subjective stress and the outcomes, and then further explore these effects with follow-up analyses and a mediation analysis.

All our models are fit in a maximal approach. We fit fixed effects for all the main effect of interest, with a random slope. We also fit fixed effects with fixed slopes for all the covariates. If a covariate is categorical with fewer than 6 levels, then we only fit fixed effects and no random slopes. Finally, we model subject as the main random effect. For each model, we test the multiple families and links, and using the AIC and residual fit, we select the best model. In the results below, we present the final selected models for brevity. Models are commented when producing this notebook to simplify the generation of the html file.

Additionally, we check models for mulitcolinearity using models without interaction terms. Models reported here are the final ones, with the interaction terms which inflates multicolinearity estimates.

4.1 Week vs Week Differences

The first set of analysis look at differences between the stress and control weeks. We model this as a fixed effect, and additionally model covariates as fixed effects for sex, study program, week order, day and time, movement, and exercise. We model fixed slopes for the covariates with multiple levels, and a random slope for the fixed effect of interest.

4.1.1 Subjective Stress

The first models will look at the subjective stress measures, and how those change between the weeks. Based on these models, we can see that there is a significant overall effect of week type on most of our stress measures, which is great. Our stress induction is working. This means we have higher subjective stress in our stress week, indicating our design is achieving its goal.

Social Stress

Relates to stress derived from social interactions, or lack thereof.

# Model
# glmer.social_week <- glmer( social_tot_s ~ Week_Type +  #Model week
#     Sex + Program +  # Model sex and program 
#     First_Week + ema_day*ema_beep_f + # Model day related items
#     acc_delta +  physical_excercise_dur + acc_delta*physical_excercise_dur + # Model movement
#     (1+Week_Type|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (0+ema_survey|castor_record_id) + (0+physical_excercise_dur|castor_record_id) + 
#     (1|castor_record_id:ema_day:ema_beep_f),
#     data=EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.social_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4794
Dependent Variable: social_tot_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 15602.498, BIC = 15971.579 

FIXED EFFECTS:
------------------------------------------------------------------------
                                           Est.    S.E.   t val.       p
-------------------------------------- -------- ------- -------- -------
(Intercept)                               1.458   0.046   32.047   0.000
Week_TypeStress                           0.019   0.016    1.185   0.236
SexMale                                   0.075   0.024    3.094   0.002
ProgramBSc_Med                            0.008   0.027    0.293   0.770
First_WeekExam-First                      0.027   0.025    1.076   0.282
ema_dayEMA 2.                            -0.083   0.052   -1.597   0.110
ema_dayEMA 3.                            -0.099   0.054   -1.833   0.067
ema_dayEMA 4.                            -0.073   0.054   -1.363   0.173
ema_dayEMA 5.                            -0.066   0.053   -1.241   0.215
ema_dayEMA 6.                            -0.052   0.055   -0.953   0.341
ema_dayEMA 7.                            -0.076   0.056   -1.349   0.177
ema_beep_f2                              -0.051   0.052   -0.985   0.325
ema_beep_f3                              -0.076   0.051   -1.477   0.140
ema_beep_f4                              -0.128   0.051   -2.494   0.013
ema_beep_f5                              -0.223   0.054   -4.107   0.000
ema_beep_f6                              -0.185   0.052   -3.537   0.000
acc_delta                                -0.002   0.001   -1.343   0.179
physical_excercise_dur                   -0.081   0.060   -1.358   0.174
ema_dayEMA 2.:ema_beep_f2                 0.063   0.072    0.868   0.386
ema_dayEMA 3.:ema_beep_f2                 0.049   0.074    0.665   0.506
ema_dayEMA 4.:ema_beep_f2                 0.032   0.075    0.435   0.663
ema_dayEMA 5.:ema_beep_f2                -0.005   0.073   -0.069   0.945
ema_dayEMA 6.:ema_beep_f2                -0.015   0.074   -0.206   0.837
ema_dayEMA 7.:ema_beep_f2                 0.078   0.076    1.029   0.303
ema_dayEMA 2.:ema_beep_f3                 0.066   0.073    0.914   0.361
ema_dayEMA 3.:ema_beep_f3                 0.088   0.074    1.189   0.234
ema_dayEMA 4.:ema_beep_f3                 0.013   0.074    0.180   0.857
ema_dayEMA 5.:ema_beep_f3                 0.026   0.073    0.356   0.722
ema_dayEMA 6.:ema_beep_f3                 0.030   0.074    0.406   0.684
ema_dayEMA 7.:ema_beep_f3                 0.108   0.075    1.436   0.151
ema_dayEMA 2.:ema_beep_f4                 0.114   0.072    1.574   0.115
ema_dayEMA 3.:ema_beep_f4                 0.083   0.073    1.139   0.255
ema_dayEMA 4.:ema_beep_f4                 0.063   0.074    0.847   0.397
ema_dayEMA 5.:ema_beep_f4                 0.068   0.073    0.923   0.356
ema_dayEMA 6.:ema_beep_f4                 0.071   0.074    0.951   0.342
ema_dayEMA 7.:ema_beep_f4                 0.076   0.076    0.998   0.318
ema_dayEMA 2.:ema_beep_f5                 0.085   0.074    1.147   0.251
ema_dayEMA 3.:ema_beep_f5                 0.116   0.076    1.514   0.130
ema_dayEMA 4.:ema_beep_f5                 0.119   0.076    1.565   0.118
ema_dayEMA 5.:ema_beep_f5                 0.080   0.078    1.036   0.300
ema_dayEMA 6.:ema_beep_f5                 0.097   0.078    1.239   0.215
ema_dayEMA 7.:ema_beep_f5                 0.138   0.078    1.775   0.076
ema_dayEMA 2.:ema_beep_f6                 0.047   0.073    0.638   0.524
ema_dayEMA 3.:ema_beep_f6                 0.060   0.074    0.800   0.424
ema_dayEMA 4.:ema_beep_f6                 0.015   0.074    0.202   0.840
ema_dayEMA 5.:ema_beep_f6                 0.061   0.074    0.819   0.413
ema_dayEMA 6.:ema_beep_f6                 0.086   0.076    1.135   0.256
ema_dayEMA 7.:ema_beep_f6                 0.147   0.084    1.743   0.081
acc_delta:physical_excercise_dur         -0.008   0.007   -1.112   0.266
------------------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.224   
          castor_record_id             physical_excercise_dur     0.237   
         castor_record_id.1                  ema_survey           0.002   
         castor_record_id.2                  acc_delta            0.005   
         castor_record_id.3                 (Intercept)           0.096   
         castor_record_id.3               Week_TypeStress         0.118   
              Residual                                            0.268   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2962     0.268 
          castor_record_id                82      0.299 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

                        Parameter  VIF Increased SE
                        Week_Type 1.00         1.00
                              Sex 1.02         1.01
                          Program 1.02         1.01
                       First_Week 1.01         1.00
                        acc_delta 1.11         1.05
           physical_excercise_dur 1.63         1.28
 acc_delta:physical_excercise_dur 1.73         1.32

High Correlation

          Parameter          VIF Increased SE
            ema_day     49993.23       223.59
         ema_beep_f     12302.90       110.92
 ema_day:ema_beep_f 172038818.37     13116.36

Physical Stress

Control items assessing physical discomfort or illness.

# Model
# glmer.physical_week<- lmer( physical_tot_s ~ Week_Type +  #Model week
#     Sex + Program +  # Model sex and program 
#     First_Week + ema_day*ema_beep_f + # Model day related items
#     acc_delta +  physical_excercise_dur + acc_delta*physical_excercise_dur + # Model movement
#     (1+Week_Type|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (0+ema_survey|castor_record_id) + (0+physical_excercise_dur|castor_record_id) + 
#     (1|castor_record_id:ema_day:ema_beep_f),
#     data=EMA_Data,
#     #family=Gamma,
#     control=lmerControl(calc.derivs = FALSE))
# Model Summary
model_output(glmer.physical_week)
MODEL INFO:
Observations: 4794
Dependent Variable: physical_tot_s
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 15852.861, BIC = 16221.943 

FIXED EFFECTS:
-----------------------------------------------------------------------------------
                                           Est.    S.E.   t val.       d.f.       p
-------------------------------------- -------- ------- -------- ---------- -------
(Intercept)                               4.593   0.246   18.701    130.233   0.000
Week_TypeStress                          -0.061   0.094   -0.645     77.815   0.521
SexMale                                  -0.291   0.212   -1.372     77.028   0.174
ProgramBSc_Med                           -0.078   0.233   -0.336     77.273   0.738
First_WeekExam-First                      0.286   0.218    1.312     77.239   0.193
ema_dayEMA 2.                            -0.225   0.157   -1.433   2717.622   0.152
ema_dayEMA 3.                             0.015   0.166    0.092   2745.046   0.927
ema_dayEMA 4.                            -0.345   0.172   -1.999   2276.572   0.046
ema_dayEMA 5.                            -0.446   0.177   -2.526   1369.682   0.012
ema_dayEMA 6.                            -0.280   0.187   -1.498    852.979   0.134
ema_dayEMA 7.                            -0.440   0.202   -2.184    599.691   0.029
ema_beep_f2                              -0.240   0.155   -1.550   2619.050   0.121
ema_beep_f3                              -0.328   0.155   -2.117   2695.627   0.034
ema_beep_f4                              -0.005   0.154   -0.034   2658.061   0.973
ema_beep_f5                              -0.809   0.165   -4.895   2856.021   0.000
ema_beep_f6                              -0.612   0.158   -3.873   2779.392   0.000
acc_delta                                -0.014   0.003   -4.112   4567.600   0.000
physical_excercise_dur                    0.607   0.180    3.382    133.755   0.001
ema_dayEMA 2.:ema_beep_f2                 0.042   0.214    0.196   2494.454   0.845
ema_dayEMA 3.:ema_beep_f2                -0.081   0.221   -0.364   2577.349   0.716
ema_dayEMA 4.:ema_beep_f2                -0.018   0.224   -0.078   2698.537   0.938
ema_dayEMA 5.:ema_beep_f2                 0.153   0.219    0.699   2614.609   0.484
ema_dayEMA 6.:ema_beep_f2                -0.044   0.221   -0.199   2583.679   0.843
ema_dayEMA 7.:ema_beep_f2                 0.152   0.228    0.667   2623.559   0.505
ema_dayEMA 2.:ema_beep_f3                 0.179   0.216    0.830   2511.717   0.406
ema_dayEMA 3.:ema_beep_f3                -0.264   0.220   -1.202   2605.486   0.230
ema_dayEMA 4.:ema_beep_f3                 0.067   0.223    0.302   2714.789   0.763
ema_dayEMA 5.:ema_beep_f3                 0.231   0.220    1.051   2637.320   0.293
ema_dayEMA 6.:ema_beep_f3                -0.117   0.221   -0.530   2594.353   0.596
ema_dayEMA 7.:ema_beep_f3                 0.067   0.226    0.299   2682.454   0.765
ema_dayEMA 2.:ema_beep_f4                 0.055   0.215    0.256   2523.859   0.798
ema_dayEMA 3.:ema_beep_f4                -0.298   0.218   -1.368   2563.772   0.171
ema_dayEMA 4.:ema_beep_f4                -0.043   0.221   -0.194   2654.929   0.846
ema_dayEMA 5.:ema_beep_f4                 0.275   0.220    1.250   2643.635   0.211
ema_dayEMA 6.:ema_beep_f4                -0.199   0.223   -0.893   2635.061   0.372
ema_dayEMA 7.:ema_beep_f4                 0.269   0.230    1.167   2722.476   0.243
ema_dayEMA 2.:ema_beep_f5                 0.172   0.222    0.775   2627.104   0.438
ema_dayEMA 3.:ema_beep_f5                -0.037   0.230   -0.160   2742.037   0.873
ema_dayEMA 4.:ema_beep_f5                 0.153   0.229    0.666   2773.748   0.506
ema_dayEMA 5.:ema_beep_f5                 0.498   0.236    2.116   2851.437   0.034
ema_dayEMA 6.:ema_beep_f5                 0.254   0.236    1.077   2769.162   0.282
ema_dayEMA 7.:ema_beep_f5                 0.515   0.237    2.173   2864.959   0.030
ema_dayEMA 2.:ema_beep_f6                 0.203   0.219    0.928   2604.480   0.353
ema_dayEMA 3.:ema_beep_f6                -0.200   0.223   -0.894   2673.127   0.372
ema_dayEMA 4.:ema_beep_f6                 0.058   0.223    0.260   2741.291   0.795
ema_dayEMA 5.:ema_beep_f6                 0.284   0.223    1.269   2717.177   0.205
ema_dayEMA 6.:ema_beep_f6                 0.342   0.228    1.503   2686.565   0.133
ema_dayEMA 7.:ema_beep_f6                 0.291   0.260    1.123   3030.450   0.262
acc_delta:physical_excercise_dur         -0.013   0.024   -0.567    982.327   0.571
-----------------------------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.222   
          castor_record_id             physical_excercise_dur     0.246   
         castor_record_id.1                  ema_survey           0.027   
         castor_record_id.2                  acc_delta            0.000   
         castor_record_id.3                 (Intercept)           0.936   
         castor_record_id.3               Week_TypeStress         0.788   
              Residual                                            1.144   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2962     0.022 
          castor_record_id                82      0.026 
--------------------------------------------------------
# Check for Multicollinearity

Low Correlation

                        Parameter  VIF Increased SE
                        Week_Type 1.00         1.00
                              Sex 1.02         1.01
                          Program 1.02         1.01
                       First_Week 1.01         1.00
                        acc_delta 1.15         1.07
           physical_excercise_dur 2.00         1.42
 acc_delta:physical_excercise_dur 2.13         1.46

High Correlation

          Parameter         VIF Increased SE
            ema_day    21246.19       145.76
         ema_beep_f    12290.46       110.86
 ema_day:ema_beep_f 81868656.53      9048.13

Results: Subjective Stress v Week

We tabulate the results, and produce a regression effect plot to visualize the results.

table.stress_week <- tab_model(glmer.event_week, glmer.activity_week,  glmer.social_week, glmer.physical_week, 
           terms=c("(Intercept)","Week_Type [Stress]", "Sex [Male]", "Program [BSc_Med]", "First_Week [Exam-First]", "acc_delta", "physical_excercise_dur"), 
          dv.labels=c("Event", "Activitiy", "Social", "Physical"), 
          title="Table 1. Subjective Stress vs Week Type", show.df=F, show.fstat = T,
          transform=NULL, 
         show.stat=TRUE,
         show.se=TRUE)
htmlTable::htmlTable(table.stress_week$knitr)
Table 1. Subjective Stress vs Week Type
  Event Activitiy Social Physical
Predictors Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) 5.57 0.15 5.28 – 5.85 37.78 <0.001 4.00 0.24 3.52 – 4.47 16.46 <0.001 1.46 0.05 1.37 – 1.55 32.05 <0.001 4.59 0.25 4.11 – 5.07 18.70 <0.001
Week_Type [Stress] 0.31 0.06 0.18 – 0.43 4.90 <0.001 0.49 0.10 0.29 – 0.69 4.81 <0.001 0.02 0.02 -0.01 – 0.05 1.19 0.236 -0.06 0.09 -0.25 – 0.12 -0.65 0.519
Sex [Male] -0.01 0.09 -0.19 – 0.17 -0.11 0.910 -0.05 0.16 -0.36 – 0.26 -0.32 0.752 0.08 0.02 0.03 – 0.12 3.09 0.002 -0.29 0.21 -0.71 – 0.12 -1.37 0.170
Program [BSc_Med] -0.01 0.10 -0.21 – 0.18 -0.15 0.881 0.00 0.17 -0.33 – 0.34 0.02 0.980 0.01 0.03 -0.04 – 0.06 0.29 0.770 -0.08 0.23 -0.54 – 0.38 -0.34 0.737
First_Week [Exam-First] -0.07 0.09 -0.25 – 0.11 -0.79 0.431 0.10 0.16 -0.22 – 0.42 0.62 0.538 0.03 0.03 -0.02 – 0.08 1.08 0.282 0.29 0.22 -0.14 – 0.71 1.31 0.190
acc_delta -0.00 0.00 -0.01 – 0.01 -0.26 0.793 0.00 0.01 -0.01 – 0.01 0.15 0.881 -0.00 0.00 -0.00 – 0.00 -1.34 0.179 -0.01 0.00 -0.02 – -0.01 -4.11 <0.001
physical_excercise_dur -0.30 0.18 -0.66 – 0.06 -1.63 0.104 0.17 0.27 -0.36 – 0.70 0.63 0.532 -0.08 0.06 -0.20 – 0.04 -1.36 0.174 0.61 0.18 0.26 – 0.96 3.38 0.001
Random Effects
σ2       1.31
τ00       0.05 castor_record_id.ema_day.ema_beep_f
      0.88 castor_record_id.3
τ11       0.62 castor_record_id.3.Week_TypeStress
      0.06 castor_record_id.physical_excercise_dur
      0.00 castor_record_id.ema_survey
      0.00 castor_record_id.acc_delta
ρ01       -0.35 castor_record_id.3
N 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id
7 ema_day 7 ema_day 7 ema_day 7 ema_day
6 ema_beep_f 6 ema_beep_f 6 ema_beep_f 6 ema_beep_f
Observations 4794 4794 4794 4794
Marginal R2 / Conditional R2 NA NA NA 0.083 / NA
# Subset the variables we want to plot
plot.mood_week <- plot_models(glmer.event_week, glmer.activity_week, glmer.social_week, glmer.physical_week)
rm_term <- as.vector(plot.mood_week$data$term[1:length(plot.mood_week$data$term)])
rm_term <- rm_term[rm_term != "Week_TypeStress"]
# Make the plot
plot.mood_week <- plot_models(glmer.event_week, glmer.activity_week, glmer.social_week, glmer.physical_week,
                                  m.labels=c("Event Stress", "Activity Stress","Social Stress", "Physical Stress" ),
                                  axis.labels = c(" "),
                                # Stastistical Stuff
                                rm.terms = rm_term,
                                #show.values = T,
                                #value.size = 4, 
                                #std.est=T, 
                                show.p=T,
                                p.shape=T,
                                legend.pval.title = "Significance", 
                                # Visual Stuff
                                colors="#666666",
                                dot.size=2,
                                line.size = 1,
                                spacing=1 , 
                                vline.color = "darkgrey", 
                                legend.title = "") + ylab("\nParameter Estimate (a.u.)") + xlab("Subjective Stress") + 
                                ptheme + 
                                theme(axis.ticks.y=element_blank(), 
                                      legend.text=element_text(size=16), legend.title = element_text(size=16),
                                      axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                                      panel.grid.major.x = element_line(colour = "grey95"),
                                      panel.grid.minor.x = element_line(colour = "grey90")) 
# Show and save
plot.mood_week+ coord_flip(ylim=c(-0.65,0.65)) + theme(panel.grid.major.y = element_line(colour = "grey95"), panel.grid.minor.y = element_line(colour = "grey90"))
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
ggsave("figures/fig_WeekResid_SubjectiveStress.tiff",units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")

4.1.2 Mood

Next, we want to investigate the impact of an examination period on mood. Conceptually, mood is an outcome of being stressed, and not a direct measure of stress. Below are the results of the models for both positive and negative mood.

Positive

# Model
# glmer.posmood_week <- glmer( mood_positive_s ~ Week_Type +  #Model week
#     Sex + Program +  # Model sex and program 
#     First_Week + ema_day*ema_beep_f + # Model day related items
#     physical_excercise_dur + acc_delta + acc_delta*physical_excercise_dur + # Model movement
#     (1+Week_Type|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (0+ema_survey|castor_record_id) + (0+physical_excercise_dur|castor_record_id) + 
#     (1|castor_record_id:ema_day:ema_beep_f),
#     data=EMA_Data,
#     family=gaussian(link="log"),
#     control=glmerControl(calc.derivs = FALSE))
# Model Summary
model_output(glmer.posmood_week)
MODEL INFO:
Observations: 4794
Dependent Variable: mood_positive_s
Type: Mixed effects generalized linear regression
Error Distribution: gaussian
Link function: log 

MODEL FIT:
AIC = 16233.449, BIC = 16602.531 

FIXED EFFECTS:
------------------------------------------------------------------------
                                           Est.    S.E.   t val.       p
-------------------------------------- -------- ------- -------- -------
(Intercept)                               1.825   0.045   40.447   0.000
Week_TypeStress                          -0.078   0.015   -5.232   0.000
SexMale                                   0.046   0.041    1.137   0.256
ProgramBSc_Med                            0.024   0.045    0.530   0.596
First_WeekExam-First                     -0.008   0.042   -0.180   0.857
ema_dayEMA 2.                             0.036   0.025    1.433   0.152
ema_dayEMA 3.                            -0.016   0.027   -0.596   0.551
ema_dayEMA 4.                            -0.011   0.027   -0.401   0.689
ema_dayEMA 5.                            -0.004   0.027   -0.142   0.887
ema_dayEMA 6.                            -0.018   0.028   -0.644   0.519
ema_dayEMA 7.                            -0.029   0.030   -0.980   0.327
ema_beep_f2                               0.016   0.025    0.622   0.534
ema_beep_f3                               0.031   0.025    1.250   0.211
ema_beep_f4                               0.020   0.025    0.808   0.419
ema_beep_f5                               0.084   0.026    3.258   0.001
ema_beep_f6                               0.076   0.025    3.060   0.002
physical_excercise_dur                    0.063   0.027    2.325   0.020
acc_delta                                 0.001   0.001    2.050   0.040
ema_dayEMA 2.:ema_beep_f2                -0.024   0.034   -0.711   0.477
ema_dayEMA 3.:ema_beep_f2                 0.014   0.036    0.381   0.703
ema_dayEMA 4.:ema_beep_f2                 0.018   0.036    0.491   0.623
ema_dayEMA 5.:ema_beep_f2                -0.002   0.036   -0.066   0.947
ema_dayEMA 6.:ema_beep_f2                 0.000   0.036    0.012   0.991
ema_dayEMA 7.:ema_beep_f2                 0.005   0.037    0.147   0.884
ema_dayEMA 2.:ema_beep_f3                -0.075   0.034   -2.172   0.030
ema_dayEMA 3.:ema_beep_f3                -0.016   0.035   -0.463   0.643
ema_dayEMA 4.:ema_beep_f3                 0.003   0.036    0.095   0.924
ema_dayEMA 5.:ema_beep_f3                -0.020   0.036   -0.565   0.572
ema_dayEMA 6.:ema_beep_f3                -0.012   0.036   -0.326   0.745
ema_dayEMA 7.:ema_beep_f3                -0.048   0.037   -1.289   0.198
ema_dayEMA 2.:ema_beep_f4                -0.031   0.034   -0.904   0.366
ema_dayEMA 3.:ema_beep_f4                 0.038   0.035    1.086   0.277
ema_dayEMA 4.:ema_beep_f4                 0.021   0.036    0.583   0.560
ema_dayEMA 5.:ema_beep_f4                -0.019   0.036   -0.536   0.592
ema_dayEMA 6.:ema_beep_f4                -0.007   0.036   -0.197   0.844
ema_dayEMA 7.:ema_beep_f4                -0.003   0.038   -0.092   0.927
ema_dayEMA 2.:ema_beep_f5                -0.050   0.035   -1.452   0.147
ema_dayEMA 3.:ema_beep_f5                -0.009   0.036   -0.235   0.814
ema_dayEMA 4.:ema_beep_f5                 0.000   0.036    0.011   0.991
ema_dayEMA 5.:ema_beep_f5                -0.072   0.038   -1.927   0.054
ema_dayEMA 6.:ema_beep_f5                -0.055   0.038   -1.471   0.141
ema_dayEMA 7.:ema_beep_f5                -0.033   0.038   -0.863   0.388
ema_dayEMA 2.:ema_beep_f6                -0.025   0.034   -0.734   0.463
ema_dayEMA 3.:ema_beep_f6                -0.029   0.035   -0.825   0.409
ema_dayEMA 4.:ema_beep_f6                -0.008   0.035   -0.229   0.819
ema_dayEMA 5.:ema_beep_f6                -0.022   0.035   -0.629   0.529
ema_dayEMA 6.:ema_beep_f6                -0.046   0.036   -1.265   0.206
ema_dayEMA 7.:ema_beep_f6                -0.010   0.041   -0.231   0.817
physical_excercise_dur:acc_delta         -0.002   0.004   -0.435   0.664
------------------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.000   
          castor_record_id             physical_excercise_dur     0.000   
         castor_record_id.1                  ema_survey           0.002   
         castor_record_id.2                  acc_delta            0.000   
         castor_record_id.3                 (Intercept)           0.173   
         castor_record_id.3               Week_TypeStress         0.122   
              Residual                                            1.220   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2962     0.000 
          castor_record_id                82      0.000 
--------------------------------------------------------
# Check for Multicollinearity

Low Correlation

                        Parameter  VIF Increased SE
                        Week_Type 1.00         1.00
                              Sex 1.02         1.01
                          Program 1.02         1.01
                       First_Week 1.01         1.00
           physical_excercise_dur 2.09         1.45
                        acc_delta 1.15         1.07
 physical_excercise_dur:acc_delta 2.22         1.49

High Correlation

          Parameter          VIF Increased SE
            ema_day     44880.88       211.85
         ema_beep_f     10326.16       101.62
 ema_day:ema_beep_f 130049717.05     11403.93

Negative

# Model
# glmer.negmood_week <- glmer( mood_negative_s ~  Week_Type +  #Model week
#     Sex + Program +  # Model sex and program 
#     First_Week + ema_day*ema_beep_f + # Model day related items
#     physical_excercise_dur + acc_delta + acc_delta*physical_excercise_dur + # Model movement
#     (1+Week_Type|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (0+ema_survey|castor_record_id) + (0+physical_excercise_dur|castor_record_id) + 
#     (1|castor_record_id:ema_day:ema_beep_f),
#     data=EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE))
# Model Summary
model_output(glmer.negmood_week) 
MODEL INFO:
Observations: 4794
Dependent Variable: mood_negative_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 11278.717, BIC = 11647.799 

FIXED EFFECTS:
------------------------------------------------------------------------
                                           Est.    S.E.   t val.       p
-------------------------------------- -------- ------- -------- -------
(Intercept)                               1.009   0.070   14.325   0.000
Week_TypeStress                           0.113   0.023    4.799   0.000
SexMale                                  -0.188   0.054   -3.500   0.000
ProgramBSc_Med                           -0.135   0.059   -2.288   0.022
First_WeekExam-First                      0.057   0.055    1.027   0.305
ema_dayEMA 2.                            -0.184   0.060   -3.080   0.002
ema_dayEMA 3.                            -0.152   0.062   -2.452   0.014
ema_dayEMA 4.                            -0.183   0.062   -2.936   0.003
ema_dayEMA 5.                            -0.165   0.062   -2.663   0.008
ema_dayEMA 6.                            -0.148   0.064   -2.326   0.020
ema_dayEMA 7.                            -0.107   0.066   -1.629   0.103
ema_beep_f2                              -0.018   0.059   -0.312   0.755
ema_beep_f3                              -0.132   0.059   -2.243   0.025
ema_beep_f4                              -0.136   0.059   -2.306   0.021
ema_beep_f5                              -0.221   0.062   -3.543   0.000
ema_beep_f6                              -0.287   0.060   -4.790   0.000
physical_excercise_dur                   -0.055   0.074   -0.746   0.456
acc_delta                                -0.003   0.001   -2.319   0.020
ema_dayEMA 2.:ema_beep_f2                 0.059   0.083    0.717   0.473
ema_dayEMA 3.:ema_beep_f2                 0.023   0.085    0.274   0.784
ema_dayEMA 4.:ema_beep_f2                 0.006   0.086    0.069   0.945
ema_dayEMA 5.:ema_beep_f2                 0.010   0.084    0.115   0.909
ema_dayEMA 6.:ema_beep_f2                -0.007   0.085   -0.086   0.931
ema_dayEMA 7.:ema_beep_f2                -0.060   0.087   -0.682   0.495
ema_dayEMA 2.:ema_beep_f3                 0.185   0.083    2.226   0.026
ema_dayEMA 3.:ema_beep_f3                 0.110   0.084    1.299   0.194
ema_dayEMA 4.:ema_beep_f3                 0.119   0.085    1.398   0.162
ema_dayEMA 5.:ema_beep_f3                 0.118   0.084    1.400   0.161
ema_dayEMA 6.:ema_beep_f3                 0.106   0.085    1.247   0.212
ema_dayEMA 7.:ema_beep_f3                 0.171   0.086    1.989   0.047
ema_dayEMA 2.:ema_beep_f4                 0.196   0.083    2.355   0.019
ema_dayEMA 3.:ema_beep_f4                 0.091   0.084    1.084   0.279
ema_dayEMA 4.:ema_beep_f4                 0.166   0.085    1.963   0.050
ema_dayEMA 5.:ema_beep_f4                 0.155   0.084    1.839   0.066
ema_dayEMA 6.:ema_beep_f4                 0.142   0.085    1.667   0.095
ema_dayEMA 7.:ema_beep_f4                 0.137   0.088    1.566   0.117
ema_dayEMA 2.:ema_beep_f5                 0.200   0.085    2.353   0.019
ema_dayEMA 3.:ema_beep_f5                 0.092   0.088    1.052   0.293
ema_dayEMA 4.:ema_beep_f5                 0.229   0.087    2.626   0.009
ema_dayEMA 5.:ema_beep_f5                 0.214   0.089    2.407   0.016
ema_dayEMA 6.:ema_beep_f5                 0.185   0.090    2.066   0.039
ema_dayEMA 7.:ema_beep_f5                 0.161   0.090    1.799   0.072
ema_dayEMA 2.:ema_beep_f6                 0.258   0.084    3.083   0.002
ema_dayEMA 3.:ema_beep_f6                 0.245   0.085    2.866   0.004
ema_dayEMA 4.:ema_beep_f6                 0.232   0.085    2.732   0.006
ema_dayEMA 5.:ema_beep_f6                 0.282   0.085    3.314   0.001
ema_dayEMA 6.:ema_beep_f6                 0.303   0.087    3.489   0.000
ema_dayEMA 7.:ema_beep_f6                 0.314   0.097    3.222   0.001
physical_excercise_dur:acc_delta         -0.004   0.008   -0.529   0.597
------------------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.250   
          castor_record_id             physical_excercise_dur     0.338   
         castor_record_id.1                  ema_survey           0.004   
         castor_record_id.2                  acc_delta            0.006   
         castor_record_id.3                 (Intercept)           0.241   
         castor_record_id.3               Week_TypeStress         0.190   
              Residual                                            0.315   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2962     0.188 
          castor_record_id                82      0.342 
--------------------------------------------------------
# Check for Multicollinearity

Low Correlation

                        Parameter  VIF Increased SE
                        Week_Type 1.00         1.00
                              Sex 1.02         1.01
                          Program 1.02         1.01
                       First_Week 1.01         1.00
           physical_excercise_dur 1.52         1.23
                        acc_delta 1.12         1.06
 physical_excercise_dur:acc_delta 1.63         1.28

High Correlation

          Parameter          VIF Increased SE
            ema_day     39883.11       199.71
         ema_beep_f     12266.18       110.75
 ema_day:ema_beep_f 140648388.77     11859.53

Results: Mood vs Subjective Stress

table.mood_week <- tab_model(glmer.posmood_week, glmer.negmood_week,
          terms=c("(Intercept)","Week_Type [Stress]", "Sex [Male]", "Program [BSc_Med]", "First_Week [Exam-First]", "acc_delta", "physical_excercise_dur"), 
          dv.labels=c("Positive", "Negative"), 
          title="Table 2. Mood vs Week Type", 
          transform=NULL, 
         show.stat=TRUE,
         show.se=TRUE)
htmlTable::htmlTable(table.mood_week$knitr)
Table 2. Mood vs Week Type
  Positive Negative
Predictors Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) 1.83 0.05 1.74 – 1.91 40.45 <0.001 1.01 0.07 0.87 – 1.15 14.32 <0.001
Week_Type [Stress] -0.08 0.01 -0.11 – -0.05 -5.23 <0.001 0.11 0.02 0.07 – 0.16 4.80 <0.001
Sex [Male] 0.05 0.04 -0.03 – 0.13 1.14 0.256 -0.19 0.05 -0.29 – -0.08 -3.50 <0.001
Program [BSc_Med] 0.02 0.04 -0.06 – 0.11 0.53 0.596 -0.14 0.06 -0.25 – -0.02 -2.29 0.022
First_Week [Exam-First] -0.01 0.04 -0.09 – 0.07 -0.18 0.857 0.06 0.06 -0.05 – 0.16 1.03 0.305
physical_excercise_dur 0.06 0.03 0.01 – 0.12 2.32 0.020 -0.06 0.07 -0.20 – 0.09 -0.75 0.456
acc_delta 0.00 0.00 0.00 – 0.00 2.05 0.040 -0.00 0.00 -0.01 – -0.00 -2.32 0.020
Random Effects
σ2 1.49  
τ00 0.00 castor_record_id.ema_day.ema_beep_f  
0.03 castor_record_id.3  
τ11 0.01 castor_record_id.3.Week_TypeStress  
0.00 castor_record_id.physical_excercise_dur  
0.00 castor_record_id.ema_survey  
0.00 castor_record_id.acc_delta  
ρ01 -0.15 castor_record_id.3  
N 82 castor_record_id 82 castor_record_id
7 ema_day 7 ema_day
6 ema_beep_f 6 ema_beep_f
Observations 4794 4794
Marginal R2 / Conditional R2 0.002 / NA NA

4.1.3 Phyisiology Stress

We established changes in subjective stress between the weeks, which has an impact on our mood outcomes. We also want to see if there’s a general difference between the physiology variables and the weeks.To do this we apply the same approach for the physiology measures as the other models. We also add measures of skin temperature here however, to make sure that we factor this in. Skin temperature is important as it can be related to sweat or heat, which can also lead to increased arousal measures.

4.1.3.1 Skin Conductance

First we model the skin conductance, controlling for skin temperature and physical exercise.

Tonic SC
# # Model
# glmer.sc_ton_mean_week <- glmer( sc_tonic_mean_s ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur + acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f), 
#     EMA_Data, 
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.sc_ton_mean_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4565
Dependent Variable: sc_tonic_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = -1329.642, BIC = -950.497 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        0.086   0.031    2.786   0.005
Week_TypeStress                   -0.004   0.011   -0.335   0.738
SexMale                           -0.007   0.013   -0.552   0.581
ProgramBSc_Med                     0.033   0.015    2.256   0.024
First_WeekExam-First              -0.038   0.014   -2.762   0.006
ema_beep_f2                       -0.027   0.037   -0.740   0.460
ema_beep_f3                       -0.021   0.036   -0.580   0.562
ema_beep_f4                       -0.045   0.036   -1.242   0.214
ema_beep_f5                       -0.027   0.038   -0.716   0.474
ema_beep_f6                        0.011   0.037    0.292   0.771
ema_dayEMA 2.                     -0.026   0.037   -0.701   0.483
ema_dayEMA 3.                     -0.077   0.038   -2.025   0.043
ema_dayEMA 4.                     -0.035   0.038   -0.912   0.362
ema_dayEMA 5.                     -0.097   0.038   -2.573   0.010
ema_dayEMA 6.                     -0.068   0.039   -1.763   0.078
ema_dayEMA 7.                     -0.063   0.039   -1.621   0.105
physical_excercise_dur             0.076   0.037    2.071   0.038
acc_delta                          0.014   0.001   10.513   0.000
temp_mean_z                        0.017   0.007    2.379   0.017
temp_slope_z                       0.019   0.008    2.342   0.019
ema_beep_f2:ema_dayEMA 2.         -0.002   0.051   -0.043   0.966
ema_beep_f3:ema_dayEMA 2.          0.039   0.051    0.757   0.449
ema_beep_f4:ema_dayEMA 2.          0.027   0.051    0.527   0.598
ema_beep_f5:ema_dayEMA 2.         -0.030   0.052   -0.570   0.569
ema_beep_f6:ema_dayEMA 2.         -0.031   0.052   -0.591   0.555
ema_beep_f2:ema_dayEMA 3.          0.026   0.052    0.497   0.619
ema_beep_f3:ema_dayEMA 3.          0.022   0.052    0.431   0.666
ema_beep_f4:ema_dayEMA 3.          0.052   0.052    1.006   0.315
ema_beep_f5:ema_dayEMA 3.          0.063   0.054    1.170   0.242
ema_beep_f6:ema_dayEMA 3.          0.058   0.052    1.106   0.269
ema_beep_f2:ema_dayEMA 4.         -0.014   0.053   -0.260   0.795
ema_beep_f3:ema_dayEMA 4.         -0.039   0.052   -0.743   0.457
ema_beep_f4:ema_dayEMA 4.         -0.011   0.052   -0.205   0.838
ema_beep_f5:ema_dayEMA 4.         -0.008   0.053   -0.158   0.875
ema_beep_f6:ema_dayEMA 4.         -0.044   0.052   -0.848   0.397
ema_beep_f2:ema_dayEMA 5.          0.063   0.052    1.204   0.229
ema_beep_f3:ema_dayEMA 5.          0.046   0.052    0.878   0.380
ema_beep_f4:ema_dayEMA 5.          0.060   0.052    1.151   0.250
ema_beep_f5:ema_dayEMA 5.          0.035   0.055    0.633   0.527
ema_beep_f6:ema_dayEMA 5.          0.042   0.052    0.803   0.422
ema_beep_f2:ema_dayEMA 6.          0.047   0.053    0.889   0.374
ema_beep_f3:ema_dayEMA 6.          0.016   0.052    0.306   0.760
ema_beep_f4:ema_dayEMA 6.          0.026   0.053    0.501   0.617
ema_beep_f5:ema_dayEMA 6.          0.019   0.055    0.341   0.733
ema_beep_f6:ema_dayEMA 6.         -0.008   0.054   -0.151   0.880
ema_beep_f2:ema_dayEMA 7.          0.026   0.054    0.480   0.631
ema_beep_f3:ema_dayEMA 7.          0.038   0.053    0.719   0.472
ema_beep_f4:ema_dayEMA 7.          0.071   0.054    1.311   0.190
ema_beep_f5:ema_dayEMA 7.          0.040   0.055    0.725   0.469
ema_beep_f6:ema_dayEMA 7.         -0.024   0.059   -0.406   0.685
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.160   
          castor_record_id                   acc_delta            0.010   
         castor_record_id.1            physical_excercise_dur     0.208   
         castor_record_id.2                 temp_mean_z           0.046   
         castor_record_id.3                 temp_slope_z          0.056   
         castor_record_id.4                 (Intercept)           0.058   
         castor_record_id.4               Week_TypeStress         0.077   
              Residual                                            0.175   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2879     0.238 
          castor_record_id                82      0.001 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.01         1.01
            temp_mean_z 1.02         1.01
           temp_slope_z 1.01         1.00

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     11831.31       108.77
            ema_day     55890.06       236.41
 ema_beep_f:ema_day 181695716.16     13479.46
Phasic Num
# Model
# glmer.sc_ph_num <- glmer( sc_phasic_num ~  Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur + acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f),  
#     EMA_Data, 
#     family=poisson(link="log"),
#     control=lmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.sc_ph_num)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_num
Type: Mixed effects generalized linear regression
Error Distribution: poisson
Link function: log 

MODEL FIT:
AIC = 44355.736, BIC = 44728.454 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   z val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        1.368   0.309    4.424   0.000
Week_TypeStress                   -0.233   0.078   -3.000   0.003
SexMale                            0.466   0.257    1.817   0.069
ProgramBSc_Med                     0.199   0.283    0.701   0.483
First_WeekExam-First              -0.001   0.264   -0.006   0.996
ema_beep_f2                       -0.049   0.224   -0.221   0.825
ema_beep_f3                       -0.227   0.221   -1.029   0.303
ema_beep_f4                       -0.510   0.223   -2.286   0.022
ema_beep_f5                       -0.393   0.232   -1.690   0.091
ema_beep_f6                       -0.236   0.227   -1.040   0.298
ema_dayEMA 2.                     -0.028   0.225   -0.127   0.899
ema_dayEMA 3.                     -0.427   0.231   -1.849   0.065
ema_dayEMA 4.                     -0.510   0.229   -2.230   0.026
ema_dayEMA 5.                     -0.564   0.230   -2.451   0.014
ema_dayEMA 6.                     -0.434   0.236   -1.834   0.067
ema_dayEMA 7.                     -0.565   0.237   -2.387   0.017
physical_excercise_dur             0.108   0.289    0.374   0.708
acc_delta                          0.150   0.014   10.612   0.000
temp_mean_z                        0.323   0.067    4.843   0.000
temp_slope_z                       0.153   0.058    2.661   0.008
ema_beep_f2:ema_dayEMA 2.         -0.381   0.314   -1.211   0.226
ema_beep_f3:ema_dayEMA 2.          0.049   0.314    0.157   0.875
ema_beep_f4:ema_dayEMA 2.          0.273   0.316    0.864   0.387
ema_beep_f5:ema_dayEMA 2.         -0.042   0.322   -0.129   0.897
ema_beep_f6:ema_dayEMA 2.         -0.640   0.322   -1.987   0.047
ema_beep_f2:ema_dayEMA 3.          0.180   0.321    0.560   0.576
ema_beep_f3:ema_dayEMA 3.          0.282   0.318    0.887   0.375
ema_beep_f4:ema_dayEMA 3.          0.480   0.317    1.514   0.130
ema_beep_f5:ema_dayEMA 3.          0.326   0.329    0.990   0.322
ema_beep_f6:ema_dayEMA 3.          0.235   0.323    0.726   0.468
ema_beep_f2:ema_dayEMA 4.          0.126   0.322    0.390   0.697
ema_beep_f3:ema_dayEMA 4.          0.172   0.320    0.536   0.592
ema_beep_f4:ema_dayEMA 4.          0.573   0.320    1.791   0.073
ema_beep_f5:ema_dayEMA 4.          0.233   0.327    0.714   0.475
ema_beep_f6:ema_dayEMA 4.          0.109   0.322    0.339   0.735
ema_beep_f2:ema_dayEMA 5.         -0.139   0.321   -0.433   0.665
ema_beep_f3:ema_dayEMA 5.          0.185   0.320    0.580   0.562
ema_beep_f4:ema_dayEMA 5.          0.673   0.319    2.107   0.035
ema_beep_f5:ema_dayEMA 5.         -0.011   0.339   -0.033   0.973
ema_beep_f6:ema_dayEMA 5.         -0.270   0.328   -0.824   0.410
ema_beep_f2:ema_dayEMA 6.          0.017   0.325    0.053   0.958
ema_beep_f3:ema_dayEMA 6.          0.256   0.324    0.790   0.430
ema_beep_f4:ema_dayEMA 6.          0.436   0.327    1.334   0.182
ema_beep_f5:ema_dayEMA 6.          0.126   0.340    0.371   0.711
ema_beep_f6:ema_dayEMA 6.         -0.209   0.334   -0.625   0.532
ema_beep_f2:ema_dayEMA 7.          0.366   0.327    1.118   0.264
ema_beep_f3:ema_dayEMA 7.          0.351   0.324    1.084   0.278
ema_beep_f4:ema_dayEMA 7.          0.348   0.332    1.050   0.294
ema_beep_f5:ema_dayEMA 7.          0.073   0.336    0.217   0.828
ema_beep_f6:ema_dayEMA 7.          0.099   0.364    0.273   0.785
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           1.262   
          castor_record_id                   acc_delta            0.124   
         castor_record_id.1            physical_excercise_dur     2.320   
         castor_record_id.2                 temp_mean_z           0.575   
         castor_record_id.3                 temp_slope_z          0.489   
         castor_record_id.4                 (Intercept)           1.103   
         castor_record_id.4               Week_TypeStress         0.678   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2879     0.163 
          castor_record_id                82      0.002 
--------------------------------------------------------
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.00         1.00
            temp_mean_z 1.00         1.00
           temp_slope_z 1.00         1.00

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     10999.77       104.88
            ema_day     46175.74       214.89
 ema_beep_f:ema_day 144610265.17     12025.40
Phasic Magnitude
# Model
# glmer.sc_ph_mag <- glmer( sc_phasic_mag_s ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur +acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f), 
#     EMA_Data, 
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.sc_ph_mag)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_mag_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 10389.643, BIC = 10768.787 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        2.136   0.122   17.572   0.000
Week_TypeStress                   -0.103   0.041   -2.493   0.013
SexMale                            0.055   0.061    0.892   0.372
ProgramBSc_Med                     0.046   0.067    0.685   0.493
First_WeekExam-First              -0.013   0.063   -0.203   0.839
ema_beep_f2                       -0.103   0.136   -0.759   0.448
ema_beep_f3                       -0.130   0.136   -0.956   0.339
ema_beep_f4                       -0.168   0.135   -1.246   0.213
ema_beep_f5                       -0.198   0.140   -1.411   0.158
ema_beep_f6                       -0.027   0.137   -0.195   0.846
ema_dayEMA 2.                     -0.107   0.137   -0.781   0.435
ema_dayEMA 3.                     -0.233   0.140   -1.666   0.096
ema_dayEMA 4.                     -0.126   0.141   -0.894   0.372
ema_dayEMA 5.                     -0.244   0.137   -1.780   0.075
ema_dayEMA 6.                     -0.223   0.141   -1.581   0.114
ema_dayEMA 7.                     -0.200   0.145   -1.376   0.169
physical_excercise_dur             0.233   0.114    2.048   0.041
acc_delta                          0.103   0.005   19.839   0.000
temp_mean_z                        0.073   0.023    3.140   0.002
temp_slope_z                       0.052   0.023    2.216   0.027
ema_beep_f2:ema_dayEMA 2.          0.061   0.188    0.325   0.745
ema_beep_f3:ema_dayEMA 2.          0.257   0.192    1.341   0.180
ema_beep_f4:ema_dayEMA 2.          0.110   0.189    0.584   0.559
ema_beep_f5:ema_dayEMA 2.          0.120   0.191    0.629   0.530
ema_beep_f6:ema_dayEMA 2.         -0.134   0.187   -0.716   0.474
ema_beep_f2:ema_dayEMA 3.          0.078   0.191    0.410   0.682
ema_beep_f3:ema_dayEMA 3.          0.151   0.190    0.791   0.429
ema_beep_f4:ema_dayEMA 3.          0.217   0.189    1.150   0.250
ema_beep_f5:ema_dayEMA 3.          0.185   0.194    0.955   0.340
ema_beep_f6:ema_dayEMA 3.          0.249   0.192    1.297   0.195
ema_beep_f2:ema_dayEMA 4.          0.076   0.193    0.395   0.693
ema_beep_f3:ema_dayEMA 4.          0.066   0.193    0.344   0.731
ema_beep_f4:ema_dayEMA 4.         -0.003   0.190   -0.014   0.989
ema_beep_f5:ema_dayEMA 4.          0.090   0.193    0.468   0.640
ema_beep_f6:ema_dayEMA 4.         -0.141   0.189   -0.750   0.453
ema_beep_f2:ema_dayEMA 5.          0.017   0.187    0.090   0.928
ema_beep_f3:ema_dayEMA 5.          0.098   0.187    0.521   0.602
ema_beep_f4:ema_dayEMA 5.          0.236   0.189    1.251   0.211
ema_beep_f5:ema_dayEMA 5.          0.165   0.198    0.836   0.403
ema_beep_f6:ema_dayEMA 5.         -0.088   0.187   -0.470   0.638
ema_beep_f2:ema_dayEMA 6.          0.197   0.193    1.025   0.305
ema_beep_f3:ema_dayEMA 6.          0.158   0.191    0.826   0.409
ema_beep_f4:ema_dayEMA 6.          0.140   0.192    0.730   0.465
ema_beep_f5:ema_dayEMA 6.          0.250   0.199    1.254   0.210
ema_beep_f6:ema_dayEMA 6.         -0.029   0.192   -0.150   0.880
ema_beep_f2:ema_dayEMA 7.          0.276   0.198    1.392   0.164
ema_beep_f3:ema_dayEMA 7.          0.148   0.194    0.764   0.445
ema_beep_f4:ema_dayEMA 7.          0.194   0.198    0.981   0.327
ema_beep_f5:ema_dayEMA 7.          0.100   0.199    0.502   0.616
ema_beep_f6:ema_dayEMA 7.          0.029   0.214    0.136   0.892
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.527   
          castor_record_id                   acc_delta            0.032   
         castor_record_id.1            physical_excercise_dur     0.493   
         castor_record_id.2                 temp_mean_z           0.134   
         castor_record_id.3                 temp_slope_z          0.122   
         castor_record_id.4                 (Intercept)           0.284   
         castor_record_id.4               Week_TypeStress         0.305   
              Residual                                            0.337   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2879     0.371 
          castor_record_id                82      0.001 
--------------------------------------------------------
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.04         1.02
           temp_slope_z 1.01         1.01

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     15343.87       123.87
            ema_day     69541.44       263.71
 ema_beep_f:ema_day 275633465.37     16602.21
Phasic AUC
# Model
# glmer.sc_ph_auc_week <- glmer( sc_phasic_auc_s  ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur +acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f), 
#     EMA_Data, 
#     family=Gamma(link=log),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.sc_ph_auc_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_auc_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 8232.712, BIC = 8611.856 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        0.361   0.063    5.703   0.000
Week_TypeStress                   -0.037   0.021   -1.747   0.081
SexMale                            0.024   0.034    0.713   0.476
ProgramBSc_Med                     0.040   0.038    1.054   0.292
First_WeekExam-First              -0.037   0.035   -1.037   0.300
ema_beep_f2                       -0.081   0.070   -1.150   0.250
ema_beep_f3                       -0.054   0.070   -0.774   0.439
ema_beep_f4                       -0.191   0.070   -2.733   0.006
ema_beep_f5                       -0.141   0.073   -1.926   0.054
ema_beep_f6                       -0.036   0.071   -0.509   0.611
ema_dayEMA 2.                     -0.027   0.071   -0.384   0.701
ema_dayEMA 3.                     -0.159   0.073   -2.188   0.029
ema_dayEMA 4.                     -0.195   0.073   -2.685   0.007
ema_dayEMA 5.                     -0.197   0.072   -2.734   0.006
ema_dayEMA 6.                     -0.183   0.074   -2.469   0.014
ema_dayEMA 7.                     -0.172   0.075   -2.289   0.022
physical_excercise_dur             0.080   0.060    1.327   0.184
acc_delta                          0.039   0.002   15.712   0.000
temp_mean_z                        0.061   0.014    4.349   0.000
temp_slope_z                       0.042   0.014    2.920   0.003
ema_beep_f2:ema_dayEMA 2.         -0.017   0.098   -0.170   0.865
ema_beep_f3:ema_dayEMA 2.         -0.038   0.098   -0.383   0.702
ema_beep_f4:ema_dayEMA 2.          0.070   0.098    0.715   0.475
ema_beep_f5:ema_dayEMA 2.          0.024   0.101    0.236   0.813
ema_beep_f6:ema_dayEMA 2.         -0.171   0.099   -1.725   0.084
ema_beep_f2:ema_dayEMA 3.          0.100   0.100    0.995   0.320
ema_beep_f3:ema_dayEMA 3.          0.048   0.100    0.485   0.628
ema_beep_f4:ema_dayEMA 3.          0.198   0.099    2.005   0.045
ema_beep_f5:ema_dayEMA 3.          0.150   0.103    1.457   0.145
ema_beep_f6:ema_dayEMA 3.          0.133   0.101    1.323   0.186
ema_beep_f2:ema_dayEMA 4.          0.172   0.101    1.703   0.089
ema_beep_f3:ema_dayEMA 4.          0.071   0.100    0.711   0.477
ema_beep_f4:ema_dayEMA 4.          0.202   0.100    2.020   0.043
ema_beep_f5:ema_dayEMA 4.          0.144   0.102    1.413   0.158
ema_beep_f6:ema_dayEMA 4.          0.037   0.100    0.371   0.711
ema_beep_f2:ema_dayEMA 5.          0.080   0.100    0.806   0.420
ema_beep_f3:ema_dayEMA 5.          0.063   0.099    0.630   0.529
ema_beep_f4:ema_dayEMA 5.          0.247   0.099    2.481   0.013
ema_beep_f5:ema_dayEMA 5.          0.069   0.106    0.649   0.516
ema_beep_f6:ema_dayEMA 5.          0.045   0.101    0.444   0.657
ema_beep_f2:ema_dayEMA 6.          0.148   0.101    1.470   0.142
ema_beep_f3:ema_dayEMA 6.          0.074   0.100    0.738   0.461
ema_beep_f4:ema_dayEMA 6.          0.178   0.101    1.759   0.079
ema_beep_f5:ema_dayEMA 6.          0.124   0.106    1.172   0.241
ema_beep_f6:ema_dayEMA 6.          0.057   0.103    0.557   0.577
ema_beep_f2:ema_dayEMA 7.          0.130   0.103    1.261   0.207
ema_beep_f3:ema_dayEMA 7.          0.105   0.101    1.040   0.299
ema_beep_f4:ema_dayEMA 7.          0.192   0.103    1.855   0.064
ema_beep_f5:ema_dayEMA 7.          0.040   0.105    0.385   0.700
ema_beep_f6:ema_dayEMA 7.          0.046   0.114    0.401   0.688
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.305   
          castor_record_id                   acc_delta            0.017   
         castor_record_id.1            physical_excercise_dur     0.284   
         castor_record_id.2                 temp_mean_z           0.094   
         castor_record_id.3                 temp_slope_z          0.094   
         castor_record_id.4                 (Intercept)           0.148   
         castor_record_id.4               Week_TypeStress         0.157   
              Residual                                            0.339   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2879     0.284 
          castor_record_id                82      0.001 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.03         1.01
           temp_slope_z 1.01         1.00

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     11818.47       108.71
            ema_day     55741.68       236.10
 ema_beep_f:ema_day 181094981.80     13457.15

4.1.3.2 Heart Rate

Next We check the heart rate data. It again looks like the relationship of the models is not as expected.

HR Mean
# Model
# glmer.hr_mean_week <- glmer( hr_mean_s ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur +acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f), 
#     EMA_Data, 
#     family=Gamma(link=identity),
#    control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.hr_mean_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4419
Dependent Variable: hr_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 7074.772, BIC = 7451.999 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        3.228   0.095   34.100   0.000
Week_TypeStress                   -0.048   0.027   -1.775   0.076
SexMale                           -0.045   0.058   -0.765   0.444
ProgramBSc_Med                     0.152   0.064    2.390   0.017
First_WeekExam-First               0.095   0.060    1.586   0.113
ema_beep_f2                       -0.003   0.098   -0.032   0.974
ema_beep_f3                       -0.030   0.098   -0.302   0.763
ema_beep_f4                        0.084   0.099    0.845   0.398
ema_beep_f5                        0.033   0.104    0.317   0.751
ema_beep_f6                       -0.326   0.096   -3.388   0.001
ema_dayEMA 2.                     -0.001   0.099   -0.010   0.992
ema_dayEMA 3.                     -0.055   0.104   -0.530   0.596
ema_dayEMA 4.                      0.010   0.103    0.096   0.924
ema_dayEMA 5.                     -0.041   0.100   -0.407   0.684
ema_dayEMA 6.                      0.035   0.105    0.333   0.739
ema_dayEMA 7.                      0.006   0.106    0.054   0.957
physical_excercise_dur             0.463   0.088    5.242   0.000
acc_delta                          0.126   0.004   28.724   0.000
temp_mean_z                       -0.057   0.023   -2.531   0.011
temp_slope_z                       0.026   0.020    1.261   0.207
ema_beep_f2:ema_dayEMA 2.          0.063   0.137    0.455   0.649
ema_beep_f3:ema_dayEMA 2.          0.048   0.139    0.343   0.731
ema_beep_f4:ema_dayEMA 2.          0.072   0.140    0.511   0.609
ema_beep_f5:ema_dayEMA 2.         -0.022   0.141   -0.158   0.874
ema_beep_f6:ema_dayEMA 2.          0.058   0.133    0.432   0.666
ema_beep_f2:ema_dayEMA 3.          0.073   0.142    0.510   0.610
ema_beep_f3:ema_dayEMA 3.          0.062   0.141    0.436   0.663
ema_beep_f4:ema_dayEMA 3.          0.046   0.142    0.325   0.745
ema_beep_f5:ema_dayEMA 3.          0.029   0.146    0.199   0.842
ema_beep_f6:ema_dayEMA 3.          0.041   0.137    0.301   0.763
ema_beep_f2:ema_dayEMA 4.         -0.053   0.143   -0.374   0.708
ema_beep_f3:ema_dayEMA 4.          0.056   0.143    0.392   0.695
ema_beep_f4:ema_dayEMA 4.         -0.090   0.143   -0.629   0.529
ema_beep_f5:ema_dayEMA 4.         -0.007   0.145   -0.046   0.963
ema_beep_f6:ema_dayEMA 4.          0.042   0.136    0.307   0.759
ema_beep_f2:ema_dayEMA 5.          0.040   0.138    0.290   0.772
ema_beep_f3:ema_dayEMA 5.          0.069   0.140    0.495   0.621
ema_beep_f4:ema_dayEMA 5.         -0.026   0.140   -0.184   0.854
ema_beep_f5:ema_dayEMA 5.         -0.012   0.147   -0.085   0.933
ema_beep_f6:ema_dayEMA 5.         -0.061   0.135   -0.455   0.649
ema_beep_f2:ema_dayEMA 6.          0.087   0.142    0.615   0.539
ema_beep_f3:ema_dayEMA 6.         -0.061   0.142   -0.431   0.667
ema_beep_f4:ema_dayEMA 6.         -0.026   0.144   -0.179   0.858
ema_beep_f5:ema_dayEMA 6.         -0.134   0.149   -0.896   0.370
ema_beep_f6:ema_dayEMA 6.         -0.115   0.138   -0.828   0.408
ema_beep_f2:ema_dayEMA 7.         -0.014   0.144   -0.094   0.925
ema_beep_f3:ema_dayEMA 7.          0.016   0.143    0.112   0.911
ema_beep_f4:ema_dayEMA 7.         -0.055   0.148   -0.373   0.709
ema_beep_f5:ema_dayEMA 7.          0.003   0.148    0.020   0.984
ema_beep_f6:ema_dayEMA 7.          0.175   0.155    1.128   0.259
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.402   
          castor_record_id                   acc_delta            0.029   
         castor_record_id.1            physical_excercise_dur     0.414   
         castor_record_id.2                 temp_mean_z           0.158   
         castor_record_id.3                 temp_slope_z          0.119   
         castor_record_id.4                 (Intercept)           0.247   
         castor_record_id.4               Week_TypeStress         0.191   
              Residual                                            0.139   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2845     0.356 
          castor_record_id                82      0.002 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.03         1.02
           temp_slope_z 1.01         1.00

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     12046.78       109.76
            ema_day     68217.13       261.18
 ema_beep_f:ema_day 224875873.84     14995.86
HR Max
# Model
# glmer.hr_max_week <- glmer( hr_max_s  ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur +acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f),  
#     EMA_Data, 
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model SUmmary
model_output(glmer.hr_max_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4419
Dependent Variable: hr_max_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 10351.346, BIC = 10728.573 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        3.613   0.123   29.474   0.000
Week_TypeStress                   -0.093   0.032   -2.909   0.004
SexMale                            0.051   0.061    0.848   0.396
ProgramBSc_Med                     0.102   0.066    1.551   0.121
First_WeekExam-First               0.120   0.062    1.947   0.051
ema_beep_f2                       -0.072   0.142   -0.508   0.612
ema_beep_f3                       -0.086   0.142   -0.608   0.543
ema_beep_f4                        0.048   0.143    0.336   0.737
ema_beep_f5                       -0.009   0.150   -0.058   0.954
ema_beep_f6                       -0.451   0.138   -3.279   0.001
ema_dayEMA 2.                     -0.092   0.142   -0.643   0.520
ema_dayEMA 3.                     -0.099   0.150   -0.658   0.511
ema_dayEMA 4.                      0.061   0.150    0.411   0.681
ema_dayEMA 5.                     -0.245   0.144   -1.709   0.087
ema_dayEMA 6.                      0.041   0.151    0.272   0.785
ema_dayEMA 7.                     -0.022   0.154   -0.140   0.888
physical_excercise_dur             0.236   0.101    2.344   0.019
acc_delta                          0.155   0.006   27.809   0.000
temp_mean_z                       -0.197   0.028   -7.062   0.000
temp_slope_z                       0.018   0.027    0.659   0.510
ema_beep_f2:ema_dayEMA 2.          0.166   0.198    0.839   0.402
ema_beep_f3:ema_dayEMA 2.          0.212   0.201    1.057   0.291
ema_beep_f4:ema_dayEMA 2.          0.048   0.201    0.237   0.812
ema_beep_f5:ema_dayEMA 2.          0.087   0.203    0.428   0.669
ema_beep_f6:ema_dayEMA 2.          0.260   0.191    1.361   0.173
ema_beep_f2:ema_dayEMA 3.          0.147   0.205    0.718   0.473
ema_beep_f3:ema_dayEMA 3.          0.097   0.203    0.476   0.634
ema_beep_f4:ema_dayEMA 3.          0.113   0.205    0.551   0.582
ema_beep_f5:ema_dayEMA 3.          0.040   0.210    0.191   0.848
ema_beep_f6:ema_dayEMA 3.          0.202   0.197    1.029   0.304
ema_beep_f2:ema_dayEMA 4.         -0.070   0.206   -0.341   0.733
ema_beep_f3:ema_dayEMA 4.          0.056   0.207    0.271   0.786
ema_beep_f4:ema_dayEMA 4.         -0.238   0.206   -1.153   0.249
ema_beep_f5:ema_dayEMA 4.         -0.102   0.209   -0.486   0.627
ema_beep_f6:ema_dayEMA 4.          0.117   0.196    0.597   0.551
ema_beep_f2:ema_dayEMA 5.          0.242   0.199    1.219   0.223
ema_beep_f3:ema_dayEMA 5.          0.293   0.201    1.460   0.144
ema_beep_f4:ema_dayEMA 5.          0.114   0.201    0.567   0.571
ema_beep_f5:ema_dayEMA 5.          0.133   0.210    0.634   0.526
ema_beep_f6:ema_dayEMA 5.          0.095   0.191    0.494   0.621
ema_beep_f2:ema_dayEMA 6.          0.025   0.205    0.124   0.901
ema_beep_f3:ema_dayEMA 6.         -0.054   0.205   -0.264   0.792
ema_beep_f4:ema_dayEMA 6.         -0.103   0.208   -0.494   0.622
ema_beep_f5:ema_dayEMA 6.         -0.223   0.215   -1.038   0.299
ema_beep_f6:ema_dayEMA 6.          0.025   0.199    0.123   0.902
ema_beep_f2:ema_dayEMA 7.          0.057   0.209    0.272   0.785
ema_beep_f3:ema_dayEMA 7.          0.131   0.207    0.631   0.528
ema_beep_f4:ema_dayEMA 7.         -0.097   0.213   -0.454   0.650
ema_beep_f5:ema_dayEMA 7.         -0.070   0.213   -0.327   0.744
ema_beep_f6:ema_dayEMA 7.          0.348   0.223    1.563   0.118
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.578   
          castor_record_id                   acc_delta            0.033   
         castor_record_id.1            physical_excercise_dur     0.222   
         castor_record_id.2                 temp_mean_z           0.179   
         castor_record_id.3                 temp_slope_z          0.137   
         castor_record_id.4                 (Intercept)           0.236   
         castor_record_id.4               Week_TypeStress         0.193   
              Residual                                            0.177   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2845     0.639 
          castor_record_id                82      0.002 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.01         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.01         1.00
 physical_excercise_dur 1.01         1.01
              acc_delta 1.03         1.01
            temp_mean_z 1.04         1.02
           temp_slope_z 1.01         1.01

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     12191.54       110.42
            ema_day     73391.98       270.91
 ema_beep_f:ema_day 241939982.63     15554.42
HR Min
# Model
# glmer.hr_min_week <- glmer( hr_min_s  ~ Week_Type + 
#     Sex + Program + # Model pop differences
#     First_Week +  ema_beep_f*ema_day + # Model day related differencxes
#     physical_excercise_dur +acc_delta + # Modle movement stuff
#     temp_mean_z + temp_slope_z +  # Model temp effects
#     (1+Week_Type |castor_record_id) + 
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id) + 
#     (0+physical_excercise_dur|castor_record_id) + (0+acc_delta|castor_record_id) + 
#     (1 | castor_record_id:ema_day:ema_beep_f), 
#     EMA_Data, 
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.hr_min_week)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4419
Dependent Variable: hr_min_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 9024.946, BIC = 9402.172 

FIXED EFFECTS:
-----------------------------------------------------------------
                                    Est.    S.E.   t val.       p
------------------------------- -------- ------- -------- -------
(Intercept)                        3.803   0.117   32.502   0.000
Week_TypeStress                   -0.034   0.035   -0.973   0.331
SexMale                           -0.333   0.072   -4.658   0.000
ProgramBSc_Med                     0.027   0.078    0.343   0.731
First_WeekExam-First               0.039   0.073    0.527   0.598
ema_beep_f2                       -0.027   0.123   -0.216   0.829
ema_beep_f3                       -0.042   0.123   -0.343   0.732
ema_beep_f4                        0.140   0.124    1.134   0.257
ema_beep_f5                        0.013   0.130    0.098   0.922
ema_beep_f6                       -0.261   0.121   -2.152   0.031
ema_dayEMA 2.                     -0.045   0.123   -0.364   0.716
ema_dayEMA 3.                     -0.047   0.129   -0.363   0.717
ema_dayEMA 4.                     -0.094   0.128   -0.738   0.461
ema_dayEMA 5.                      0.011   0.125    0.089   0.929
ema_dayEMA 6.                      0.085   0.131    0.647   0.517
ema_dayEMA 7.                     -0.094   0.131   -0.715   0.475
physical_excercise_dur             0.527   0.106    4.987   0.000
acc_delta                          0.088   0.004   20.052   0.000
temp_mean_z                        0.073   0.025    2.876   0.004
temp_slope_z                       0.038   0.025    1.511   0.131
ema_beep_f2:ema_dayEMA 2.          0.099   0.172    0.575   0.565
ema_beep_f3:ema_dayEMA 2.          0.029   0.173    0.168   0.867
ema_beep_f4:ema_dayEMA 2.          0.083   0.175    0.475   0.635
ema_beep_f5:ema_dayEMA 2.          0.009   0.176    0.054   0.957
ema_beep_f6:ema_dayEMA 2.          0.053   0.168    0.313   0.754
ema_beep_f2:ema_dayEMA 3.          0.051   0.178    0.288   0.774
ema_beep_f3:ema_dayEMA 3.          0.035   0.176    0.200   0.841
ema_beep_f4:ema_dayEMA 3.         -0.045   0.177   -0.256   0.798
ema_beep_f5:ema_dayEMA 3.          0.084   0.183    0.460   0.646
ema_beep_f6:ema_dayEMA 3.         -0.020   0.173   -0.117   0.907
ema_beep_f2:ema_dayEMA 4.          0.014   0.177    0.077   0.939
ema_beep_f3:ema_dayEMA 4.          0.046   0.177    0.257   0.797
ema_beep_f4:ema_dayEMA 4.         -0.022   0.178   -0.122   0.903
ema_beep_f5:ema_dayEMA 4.          0.205   0.181    1.131   0.258
ema_beep_f6:ema_dayEMA 4.          0.116   0.172    0.679   0.497
ema_beep_f2:ema_dayEMA 5.         -0.016   0.173   -0.094   0.925
ema_beep_f3:ema_dayEMA 5.         -0.038   0.175   -0.217   0.828
ema_beep_f4:ema_dayEMA 5.         -0.156   0.175   -0.890   0.373
ema_beep_f5:ema_dayEMA 5.         -0.034   0.184   -0.188   0.851
ema_beep_f6:ema_dayEMA 5.         -0.089   0.171   -0.519   0.604
ema_beep_f2:ema_dayEMA 6.          0.029   0.178    0.163   0.870
ema_beep_f3:ema_dayEMA 6.         -0.074   0.177   -0.417   0.677
ema_beep_f4:ema_dayEMA 6.         -0.181   0.180   -1.004   0.315
ema_beep_f5:ema_dayEMA 6.         -0.151   0.187   -0.807   0.420
ema_beep_f6:ema_dayEMA 6.         -0.208   0.175   -1.188   0.235
ema_beep_f2:ema_dayEMA 7.          0.087   0.179    0.488   0.626
ema_beep_f3:ema_dayEMA 7.          0.066   0.177    0.374   0.708
ema_beep_f4:ema_dayEMA 7.         -0.021   0.183   -0.113   0.910
ema_beep_f5:ema_dayEMA 7.          0.050   0.184    0.272   0.785
ema_beep_f6:ema_dayEMA 7.          0.299   0.195    1.534   0.125
-----------------------------------------------------------------

RANDOM EFFECTS:
--------------------------------------------------------------------------
                Group                        Parameter          Std. Dev. 
------------------------------------- ------------------------ -----------
 castor_record_id.ema_day.ema_beep_f        (Intercept)           0.508   
          castor_record_id                   acc_delta            0.026   
         castor_record_id.1            physical_excercise_dur     0.461   
         castor_record_id.2                 temp_mean_z           0.165   
         castor_record_id.3                 temp_slope_z          0.151   
         castor_record_id.4                 (Intercept)           0.296   
         castor_record_id.4               Week_TypeStress         0.256   
              Residual                                            0.167   
--------------------------------------------------------------------------

Grouping variables:
--------------------------------------------------------
                Group                  # groups    ICC  
------------------------------------- ---------- -------
 castor_record_id:ema_day:ema_beep_f     2845     0.406 
          castor_record_id                82      0.001 
--------------------------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
              Week_Type 1.00         1.00
                    Sex 1.02         1.01
                Program 1.02         1.01
             First_Week 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.04         1.02
           temp_slope_z 1.01         1.00

High Correlation

          Parameter          VIF Increased SE
         ema_beep_f     12502.42       111.81
            ema_day     60554.17       246.08
 ema_beep_f:ema_day 207552984.59     14406.70

4.1.3.3 Results: Physiology vs Weektype

We now present the physiology results in a table, corrected for multiple comparisons with FDR.

table.physio_week <- tab_model(glmer.sc_ton_mean_week, glmer.sc_ph_num, glmer.sc_ph_mag, glmer.sc_ph_auc_week,
                           glmer.hr_mean_week, glmer.hr_min_week, glmer.hr_max_week, 
         terms=c("(Intercept)","Week_Type [Stress]", "Sex [Male]", "Program [BSc_Med]", "First_Week [Exam-First]", "acc_delta", "physical_excercise_dur", 
         "temp_mean_z", "temp_slope_z"), 
          dv.labels=c("Tonic", "Number", "Magnitude", "AUC", "Mean", "Min", "Max"), 
          title="Table 3. Physio vs Week Type", 
          transform=NULL, p.adjust="fdr",
         show.stat=TRUE,
         show.se=T) 
htmlTable::htmlTable(table.physio_week$knitr)
Table 3. Physio vs Week Type
  Tonic Number Magnitude AUC Mean Min Max
Predictors Estimates std. Error CI Statistic p Log-Mean std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) 0.09 0.03 0.03 – 0.15 2.79 0.096 1.37 0.31 0.76 – 1.97 4.42 <0.001 2.14 0.12 1.90 – 2.37 17.57 <0.001 0.36 0.06 0.24 – 0.49 5.70 <0.001 3.23 0.09 3.04 – 3.41 34.10 <0.001 3.80 0.12 3.57 – 4.03 32.50 <0.001 3.61 0.12 3.37 – 3.85 29.47 <0.001
Week_Type [Stress] -0.00 0.01 -0.02 – 0.02 -0.33 0.856 -0.23 0.08 -0.39 – -0.08 -3.00 0.034 -0.10 0.04 -0.18 – -0.02 -2.49 0.159 -0.04 0.02 -0.08 – 0.00 -1.75 0.233 -0.05 0.03 -0.10 – 0.01 -1.78 0.542 -0.03 0.04 -0.10 – 0.03 -0.97 0.957 -0.09 0.03 -0.16 – -0.03 -2.91 0.036
Sex [Male] -0.01 0.01 -0.03 – 0.02 -0.55 0.809 0.47 0.26 -0.04 – 0.97 1.82 0.244 0.05 0.06 -0.07 – 0.17 0.89 0.718 0.02 0.03 -0.04 – 0.09 0.71 0.645 -0.04 0.06 -0.16 – 0.07 -0.76 0.992 -0.33 0.07 -0.47 – -0.19 -4.66 <0.001 0.05 0.06 -0.07 – 0.17 0.85 0.900
Program [BSc_Med] 0.03 0.01 0.00 – 0.06 2.26 0.172 0.20 0.28 -0.36 – 0.75 0.70 0.755 0.05 0.07 -0.09 – 0.18 0.69 0.725 0.04 0.04 -0.03 – 0.11 1.05 0.499 0.15 0.06 0.03 – 0.28 2.39 0.140 0.03 0.08 -0.13 – 0.18 0.34 0.957 0.10 0.07 -0.03 – 0.23 1.55 0.604
First_Week [Exam-First] -0.04 0.01 -0.06 – -0.01 -2.76 0.096 -0.00 0.26 -0.52 – 0.52 -0.01 0.996 -0.01 0.06 -0.14 – 0.11 -0.20 0.919 -0.04 0.04 -0.11 – 0.03 -1.04 0.499 0.09 0.06 -0.02 – 0.21 1.59 0.705 0.04 0.07 -0.11 – 0.18 0.53 0.957 0.12 0.06 -0.00 – 0.24 1.95 0.368
physical_excercise_dur 0.08 0.04 0.00 – 0.15 2.07 0.238 0.11 0.29 -0.46 – 0.67 0.37 0.889 0.23 0.11 0.01 – 0.46 2.05 0.338 0.08 0.06 -0.04 – 0.20 1.33 0.387 0.46 0.09 0.29 – 0.64 5.24 <0.001 0.53 0.11 0.32 – 0.73 4.99 <0.001 0.24 0.10 0.04 – 0.43 2.34 0.159
acc_delta 0.01 0.00 0.01 – 0.02 10.51 <0.001 0.15 0.01 0.12 – 0.18 10.61 <0.001 0.10 0.01 0.09 – 0.11 19.84 <0.001 0.04 0.00 0.03 – 0.04 15.71 <0.001 0.13 0.00 0.12 – 0.14 28.72 <0.001 0.09 0.00 0.08 – 0.10 20.05 <0.001 0.16 0.01 0.14 – 0.17 27.81 <0.001
temp_mean_z 0.02 0.01 0.00 – 0.03 2.38 0.160 0.32 0.07 0.19 – 0.45 4.84 <0.001 0.07 0.02 0.03 – 0.12 3.14 0.028 0.06 0.01 0.03 – 0.09 4.35 <0.001 -0.06 0.02 -0.10 – -0.01 -2.53 0.114 0.07 0.03 0.02 – 0.12 2.88 0.040 -0.20 0.03 -0.25 – -0.14 -7.06 <0.001
temp_slope_z 0.02 0.01 0.00 – 0.03 2.34 0.160 0.15 0.06 0.04 – 0.27 2.66 0.078 0.05 0.02 0.01 – 0.10 2.22 0.267 0.04 0.01 0.01 – 0.07 2.92 0.044 0.03 0.02 -0.01 – 0.07 1.26 0.992 0.04 0.03 -0.01 – 0.09 1.51 0.818 0.02 0.03 -0.03 – 0.07 0.66 0.900
N 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id
7 ema_day 7 ema_day 7 ema_day 7 ema_day 7 ema_day 7 ema_day 7 ema_day
6 ema_beep_f 6 ema_beep_f 6 ema_beep_f 6 ema_beep_f 6 ema_beep_f 6 ema_beep_f 6 ema_beep_f
Observations 4565 4565 4565 4565 4419 4419 4419

4.1.4 Plot: Week v Outcomes

Finally, we can plot the estimates for the week differences here, also correcting for multiple comparisons with FDR.

# Together
plot.physio <- plot_models(glmer.posmood_week, glmer.sc_ton_mean_week, glmer.sc_ph_num)
rm_term <- as.vector(plot.physio$data$term[1:97])
rm_term <- rm_term[rm_term != "Week_TypeStress"]
# Color list
col_list <-c('#7570B3','#7570B3','#7570B3',"#D95F02", "#D95F02", '#D95F02', '#D95F02', "#1B9E77", "#1B9E77")
# Make the plot
plot.all_week_resid <- plot_models( glmer.posmood_week, glmer.negmood_week, 
            glmer.sc_ton_mean_week, glmer.sc_ph_num, glmer.sc_ph_mag, glmer.sc_ph_auc_week, 
            glmer.hr_mean_week, glmer.hr_min_week, glmer.hr_max_week,
            m.labels=c("Positive Affect", "Negative Affect", "SC Tonic", "SC Number", "SC Magnitued", "SC AUC","HR Mean", "HR Minimum", "HR Maximum"),
            axis.labels = c(" "),
            # Stastistical Stuff
            rm.terms = rm_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size = 1,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + 
            theme(axis.ticks.y=element_blank(), 
                  legend.text=element_text(size=16), legend.title = element_text(size=16),
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
# Plot and save
plot.all_week_resid + coord_flip(ylim=c(-0.5,0.5)) + theme(panel.grid.major.y = element_line(colour = "grey95"), panel.grid.minor.y = element_line(colour = "grey90"))
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
ggsave("figures/fig_WeekResid_ALL.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")

4.2 Momentary Associations

We saw lower physiological arousal in the exam week, which was unexpected. We also see lower positive arousal. So it could be that the effects we see are actually driven by our positive arousal/mood. To check this, and to also check whether we can replicate previous indings on moment-to-moment associations between subjective stress and physiological arousal and mood, we discard week type, and look at the measure continuously.

In this models, we use a fixed slope due to convergence issues. We initially tried changing optimizers, which did not result in better convergence, so we simplified the model by doing a fixed slope for our fixed effect of interest. We again use more or less the same covariates as before, except for program, and for day. We keep the time variable in there to control for circadian rhythms. Additionally, we see there is a correlation between our subjective stress measures, so we need to factor this effect in by modeling interaction terms as well.

 rcorr(as.matrix(EMA_Data[,c("event_tot_s", "activity_tot_s", "social_tot_s", "physical_tot_s")]))
               event_tot_s activity_tot_s social_tot_s physical_tot_s
event_tot_s           1.00           0.42         0.17           0.07
activity_tot_s        0.42           1.00         0.34           0.16
social_tot_s          0.17           0.34         1.00           0.18
physical_tot_s        0.07           0.16         0.18           1.00

n= 5735 


P
               event_tot_s activity_tot_s social_tot_s physical_tot_s
event_tot_s                 0              0            0            
activity_tot_s  0                          0            0            
social_tot_s    0           0                           0            
physical_tot_s  0           0              0                         

4.2.1 Mood

First we check the moment-to-moment associations between positive affect and subjective stress. These confirm that momentary subjective stress is also associated with reduced positive affect, and increased negative affect.

Positive

# glmer.posmood_beep <- lmer(mood_positive_s ~ 
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#    # family=gaussian(link="identity"),
#     control=lmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.posmood_beep )
MODEL INFO:
Observations: 4793
Dependent Variable: mood_positive_s
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 14811.445, BIC = 14999.218
Pseudo-R² (fixed effects) = 0.257
Pseudo-R² (total) = 0.530 

FIXED EFFECTS:
------------------------------------------------------------------------------
                                      Est.    S.E.   t val.       d.f.       p
--------------------------------- -------- ------- -------- ---------- -------
(Intercept)                          9.714   0.204   47.520   4193.440   0.000
event_tot_s                         -0.120   0.035   -3.452    664.640   0.001
activity_tot_s                      -0.200   0.040   -4.951   2124.591   0.000
social_tot_s                        -0.299   0.031   -9.745    629.127   0.000
physical_tot_s                      -0.152   0.020   -7.628     92.148   0.000
ema_beep                            -0.010   0.013   -0.816    122.407   0.416
SexMale                              0.271   0.142    1.915    246.186   0.057
physical_excercise_dur               0.530   0.120    4.426     36.837   0.000
acc_delta                            0.004   0.003    1.298   4597.881   0.194
temp_mean_z                         -0.003   0.028   -0.109     59.550   0.913
temp_slope_z                        -0.015   0.016   -0.936   4581.209   0.350
event_tot_s:activity_tot_s          -0.017   0.006   -2.808   3581.305   0.005
activity_tot_s:social_tot_s          0.027   0.005    5.131   2882.146   0.000
------------------------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.131   
  castor_record_id        activity_tot_s         0.071   
  castor_record_id         social_tot_s          0.111   
  castor_record_id        physical_tot_s         0.135   
 castor_record_id.1          ema_beep            0.068   
 castor_record_id.2        temp_slope_z          0.000   
 castor_record_id.3        temp_mean_z           0.151   
 castor_record_id.4         acc_delta            0.000   
 castor_record_id.5   physical_excercise_dur     0.308   
      Residual                                   1.056   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.014 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 3.41         1.85
           social_tot_s 3.40         1.84
         physical_tot_s 1.19         1.09
               ema_beep 1.04         1.02
                    Sex 1.00         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.03         1.02
            temp_mean_z 1.03         1.02
           temp_slope_z 1.02         1.01

Moderate Correlation

                   Parameter  VIF Increased SE
 activity_tot_s:social_tot_s 7.92         2.81

High Correlation

                  Parameter   VIF Increased SE
             activity_tot_s 12.52         3.54
 event_tot_s:activity_tot_s 16.21         4.03

Negative

# glmer.negmood_beep <- glmer(mood_negative_s ~ 
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.negmood_beep)
MODEL INFO:
Observations: 4793
Dependent Variable: mood_negative_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 11818.666, BIC = 12006.439
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          0.775   0.134    5.788   0.000
event_tot_s                          0.035   0.021    1.648   0.099
activity_tot_s                       0.080   0.029    2.749   0.006
social_tot_s                         0.234   0.023   10.148   0.000
physical_tot_s                       0.127   0.015    8.211   0.000
ema_beep                             0.020   0.010    2.024   0.043
SexMale                             -0.244   0.096   -2.531   0.011
physical_excercise_dur              -0.195   0.080   -2.444   0.015
acc_delta                           -0.002   0.003   -0.705   0.481
temp_mean_z                          0.021   0.025    0.823   0.410
temp_slope_z                        -0.013   0.015   -0.832   0.406
event_tot_s:activity_tot_s           0.011   0.004    2.612   0.009
activity_tot_s:social_tot_s         -0.011   0.004   -2.712   0.007
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.061   
  castor_record_id        activity_tot_s         0.066   
  castor_record_id         social_tot_s          0.096   
  castor_record_id        physical_tot_s         0.101   
 castor_record_id.1          ema_beep            0.057   
 castor_record_id.2        temp_slope_z          0.057   
 castor_record_id.3        temp_mean_z           0.155   
 castor_record_id.4         acc_delta            0.012   
 castor_record_id.5   physical_excercise_dur     0.226   
      Residual                                   0.376   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.016 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 3.21         1.79
           social_tot_s 2.67         1.64
         physical_tot_s 1.09         1.05
               ema_beep 1.02         1.01
                    Sex 1.01         1.00
 physical_excercise_dur 1.01         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.02         1.01
           temp_slope_z 1.01         1.01

Moderate Correlation

                   Parameter  VIF Increased SE
              activity_tot_s 8.16         2.86
 activity_tot_s:social_tot_s 5.50         2.35

High Correlation

                  Parameter   VIF Increased SE
 event_tot_s:activity_tot_s 11.22         3.35

Table: Mood per Beep

table.mood_beep <- tab_model(glmer.posmood_beep, glmer.negmood_beep,
         # terms=c("(Intercept)","Week_Type [Stress]", "Sex [Male]", "Program [BSc_Med]", "First_Week [Exam-First]", "acc_delta", "physical_excercise_dur"), 
          title="Table 3. HR vs Week Type", 
          transform=NULL, p.adjust = "fdr",
         show.stat=TRUE,
         show.se=TRUE) 
htmlTable::htmlTable(table.mood_beep$knitr)
Table 3. HR vs Week Type
  mood positive s mood negative s
Predictors Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) 9.71 0.20 9.31 – 10.11 47.52 <0.001 0.77 0.13 0.51 – 1.04 5.79 <0.001
event_tot_s -0.12 0.03 -0.19 – -0.05 -3.45 0.001 0.04 0.02 -0.01 – 0.08 1.65 0.129
activity_tot_s -0.20 0.04 -0.28 – -0.12 -4.95 <0.001 0.08 0.03 0.02 – 0.14 2.75 0.017
social_tot_s -0.30 0.03 -0.36 – -0.24 -9.75 <0.001 0.23 0.02 0.19 – 0.28 10.15 <0.001
physical_tot_s -0.15 0.02 -0.19 – -0.11 -7.63 <0.001 0.13 0.02 0.10 – 0.16 8.21 <0.001
ema_beep -0.01 0.01 -0.03 – 0.01 -0.82 0.449 0.02 0.01 0.00 – 0.04 2.02 0.062
Sex [Male] 0.27 0.14 -0.01 – 0.55 1.92 0.080 -0.24 0.10 -0.43 – -0.05 -2.53 0.021
physical_excercise_dur 0.53 0.12 0.30 – 0.76 4.43 <0.001 -0.19 0.08 -0.35 – -0.04 -2.44 0.024
acc_delta 0.00 0.00 -0.00 – 0.01 1.30 0.253 -0.00 0.00 -0.01 – 0.00 -0.71 0.481
temp_mean_z -0.00 0.03 -0.06 – 0.05 -0.11 0.913 0.02 0.03 -0.03 – 0.07 0.82 0.445
temp_slope_z -0.02 0.02 -0.05 – 0.02 -0.94 0.413 -0.01 0.02 -0.04 – 0.02 -0.83 0.445
event_tot_s *
activity_tot_s
-0.02 0.01 -0.03 – -0.01 -2.81 0.008 0.01 0.00 0.00 – 0.02 2.61 0.019
activity_tot_s *
social_tot_s
0.03 0.01 0.02 – 0.04 5.13 <0.001 -0.01 0.00 -0.02 – -0.00 -2.71 0.017
N 82 castor_record_id 82 castor_record_id
Observations 4793 4793

4.2.2 Skin conductance

We next model the skin conductance vs. the subjective stress measures. We expect that continuous analysis will result in a replication of previous findings where momentary stress is indeed associated with increase physiological arousal. Our findings are indeed shown in Table: Subjective Stress and Outcomes.

Tonic Mean

# Model
# glmer.sc_ton_ema <- glmer(sc_tonic_mean_s ~ 
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.sc_ton_ema)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_tonic_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 703.846, BIC = 890.205
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                         -0.005   0.054   -0.089   0.929
event_tot_s                          0.013   0.009    1.502   0.133
activity_tot_s                       0.014   0.011    1.291   0.197
social_tot_s                         0.000   0.008    0.009   0.993
physical_tot_s                      -0.002   0.004   -0.533   0.594
ema_beep                             0.001   0.003    0.428   0.669
SexMale                              0.001   0.020    0.060   0.952
physical_excercise_dur               0.083   0.049    1.688   0.091
acc_delta                            0.018   0.002    9.518   0.000
temp_mean_z                          0.042   0.009    4.487   0.000
temp_slope_z                         0.027   0.009    2.835   0.005
event_tot_s:activity_tot_s          -0.003   0.002   -1.643   0.100
activity_tot_s:social_tot_s         -0.001   0.001   -0.445   0.656
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.023   
  castor_record_id        activity_tot_s         0.020   
  castor_record_id         social_tot_s          0.024   
  castor_record_id        physical_tot_s         0.024   
 castor_record_id.1          ema_beep            0.015   
 castor_record_id.2        temp_slope_z          0.062   
 castor_record_id.3        temp_mean_z           0.065   
 castor_record_id.4         acc_delta            0.014   
 castor_record_id.5   physical_excercise_dur     0.289   
      Residual                                   0.279   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.003 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
           social_tot_s 4.73         2.17
         physical_tot_s 1.11         1.05
               ema_beep 1.04         1.02
                    Sex 1.01         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.01         1.00
            temp_mean_z 1.02         1.01
           temp_slope_z 1.00         1.00

Moderate Correlation

   Parameter  VIF Increased SE
 event_tot_s 5.32         2.31

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 13.47         3.67
  event_tot_s:activity_tot_s 21.44         4.63
 activity_tot_s:social_tot_s 11.33         3.37

Phasic Number

# Model
# glmer.sc_ph_num_ema <- glmer(sc_phasic_num  ~ 
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=poisson(link="sqrt"),
#     control=glmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.sc_ph_num_ema)
Could not calculate r-squared. Try removing missing data
before fitting the model.
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_num
Type: Mixed effects generalized linear regression
Error Distribution: poisson
Link function: sqrt 

MODEL FIT:
AIC = 75466.975, BIC = 75646.908 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   z val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          2.006   0.113   17.691   0.000
event_tot_s                          0.039   0.029    1.349   0.177
activity_tot_s                       0.083   0.038    2.201   0.028
social_tot_s                         0.027   0.030    0.904   0.366
physical_tot_s                       0.035   0.030    1.156   0.248
ema_beep                            -0.052   0.024   -2.140   0.032
SexMale                              0.843   0.115    7.362   0.000
physical_excercise_dur              -0.197   0.409   -0.482   0.630
acc_delta                            0.228   0.014   16.039   0.000
temp_mean_z                          0.427   0.091    4.710   0.000
temp_slope_z                         0.223   0.069    3.236   0.001
event_tot_s:activity_tot_s          -0.009   0.003   -2.782   0.005
activity_tot_s:social_tot_s         -0.011   0.003   -3.916   0.000
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.211   
  castor_record_id        activity_tot_s         0.279   
  castor_record_id         social_tot_s          0.234   
  castor_record_id        physical_tot_s         0.266   
 castor_record_id.1          ema_beep            0.214   
 castor_record_id.2        temp_slope_z          0.610   
 castor_record_id.3        temp_mean_z           0.810   
 castor_record_id.4         acc_delta            0.126   
 castor_record_id.5   physical_excercise_dur     3.508   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.003 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                   Parameter  VIF Increased SE
                 event_tot_s 1.83         1.35
              activity_tot_s 2.80         1.67
                social_tot_s 2.22         1.49
              physical_tot_s 1.31         1.14
                    ema_beep 1.00         1.00
                         Sex 1.00         1.00
      physical_excercise_dur 1.00         1.00
                   acc_delta 1.00         1.00
                 temp_mean_z 1.00         1.00
                temp_slope_z 1.00         1.00
  event_tot_s:activity_tot_s 2.77         1.66
 activity_tot_s:social_tot_s 2.32         1.52

Phasic Magnitude

# Model
# glmer.sc_ph_mag_ema <- glmer(sc_phasic_mag_s   ~
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.sc_ph_mag_ema)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_mag_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 11198.234, BIC = 11384.593
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          1.338   0.165    8.124   0.000
event_tot_s                          0.071   0.027    2.670   0.008
activity_tot_s                       0.070   0.033    2.155   0.031
social_tot_s                        -0.004   0.023   -0.177   0.859
physical_tot_s                       0.028   0.013    2.142   0.032
ema_beep                            -0.001   0.009   -0.071   0.944
SexMale                              0.042   0.072    0.583   0.560
physical_excercise_dur               0.362   0.130    2.788   0.005
acc_delta                            0.107   0.006   18.206   0.000
temp_mean_z                          0.119   0.025    4.814   0.000
temp_slope_z                         0.068   0.021    3.231   0.001
event_tot_s:activity_tot_s          -0.012   0.005   -2.447   0.014
activity_tot_s:social_tot_s         -0.001   0.004   -0.322   0.747
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.061   
  castor_record_id        activity_tot_s         0.053   
  castor_record_id         social_tot_s          0.050   
  castor_record_id        physical_tot_s         0.066   
 castor_record_id.1          ema_beep            0.044   
 castor_record_id.2        temp_slope_z          0.088   
 castor_record_id.3        temp_mean_z           0.151   
 castor_record_id.4         acc_delta            0.037   
 castor_record_id.5   physical_excercise_dur     0.628   
      Residual                                   0.408   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.006 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 4.83         2.20
         physical_tot_s 1.10         1.05
               ema_beep 1.05         1.03
                    Sex 1.01         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.01         1.01
            temp_mean_z 1.02         1.01
           temp_slope_z 1.01         1.00

Moderate Correlation

    Parameter  VIF Increased SE
 social_tot_s 5.32         2.31

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 14.63         3.83
  event_tot_s:activity_tot_s 21.24         4.61
 activity_tot_s:social_tot_s 12.72         3.57

Phasic AUC

# Model
# glmer.sc_ph_auc_ema <- glmer(sc_phasic_auc_s  ~
#      event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.sc_ph_auc_ema)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_auc_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 9873.846, BIC = 10060.205
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          1.061   0.158    6.700   0.000
event_tot_s                          0.019   0.024    0.781   0.435
activity_tot_s                       0.031   0.031    0.977   0.328
social_tot_s                         0.014   0.022    0.644   0.520
physical_tot_s                       0.011   0.011    0.998   0.318
ema_beep                             0.010   0.009    1.085   0.278
SexMale                              0.029   0.064    0.458   0.647
physical_excercise_dur               0.225   0.115    1.959   0.050
acc_delta                            0.119   0.007   16.349   0.000
temp_mean_z                          0.120   0.026    4.714   0.000
temp_slope_z                         0.074   0.024    3.043   0.002
event_tot_s:activity_tot_s          -0.004   0.005   -0.778   0.437
activity_tot_s:social_tot_s         -0.004   0.004   -0.941   0.347
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.000   
  castor_record_id        activity_tot_s         0.053   
  castor_record_id         social_tot_s          0.050   
  castor_record_id        physical_tot_s         0.052   
 castor_record_id.1          ema_beep            0.045   
 castor_record_id.2        temp_slope_z          0.135   
 castor_record_id.3        temp_mean_z           0.166   
 castor_record_id.4         acc_delta            0.052   
 castor_record_id.5   physical_excercise_dur     0.485   
      Residual                                   0.504   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.000 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
         physical_tot_s 1.13         1.06
               ema_beep 1.05         1.02
                    Sex 1.01         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.01         1.00
            temp_mean_z 1.02         1.01
           temp_slope_z 1.00         1.00

Moderate Correlation

    Parameter  VIF Increased SE
  event_tot_s 5.21         2.28
 social_tot_s 5.46         2.34

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 14.59         3.82
  event_tot_s:activity_tot_s 20.25         4.50
 activity_tot_s:social_tot_s 13.38         3.66

4.2.3 Heart Rate

Finally, we also take a look at subjective stress associations with subjective stress. Here we do not see any striking relationships.

Mean

# Model
# glmer.hr_mean_ema <- glmer(hr_mean_s ~
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#    control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000)))
# Model Summary
model_output(glmer.hr_mean_ema)
MODEL INFO:
Observations: 4419
Dependent Variable: hr_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 8209.278, BIC = 8394.694
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          3.205   0.120   26.733   0.000
event_tot_s                          0.021   0.019    1.111   0.267
activity_tot_s                      -0.006   0.024   -0.271   0.786
social_tot_s                        -0.025   0.017   -1.456   0.145
physical_tot_s                       0.023   0.010    2.257   0.024
ema_beep                            -0.042   0.007   -5.653   0.000
SexMale                              0.020   0.064    0.313   0.754
physical_excercise_dur               0.359   0.080    4.482   0.000
acc_delta                            0.144   0.005   29.562   0.000
temp_mean_z                         -0.089   0.022   -4.066   0.000
temp_slope_z                         0.032   0.021    1.556   0.120
event_tot_s:activity_tot_s          -0.003   0.004   -0.724   0.469
activity_tot_s:social_tot_s          0.004   0.003    1.210   0.226
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.052   
  castor_record_id        activity_tot_s         0.040   
  castor_record_id         social_tot_s          0.048   
  castor_record_id        physical_tot_s         0.058   
 castor_record_id.1          ema_beep            0.039   
 castor_record_id.2        temp_slope_z          0.115   
 castor_record_id.3        temp_mean_z           0.147   
 castor_record_id.4         acc_delta            0.033   
 castor_record_id.5   physical_excercise_dur     0.282   
      Residual                                   0.172   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.018 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 4.51         2.12
           social_tot_s 4.37         2.09
         physical_tot_s 1.10         1.05
               ema_beep 1.05         1.02
                    Sex 1.00         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.01         1.01
            temp_mean_z 1.03         1.01
           temp_slope_z 1.01         1.00

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 13.76         3.71
  event_tot_s:activity_tot_s 20.14         4.49
 activity_tot_s:social_tot_s 10.72         3.27

Min

# Model
# glmer.hr_min_ema <- glmer(hr_min_s  ~
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.hr_min_ema)
MODEL INFO:
Observations: 4419
Dependent Variable: hr_min_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 10278.955, BIC = 10464.372
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          1.337   0.041   32.424   0.000
event_tot_s                          0.003   0.007    0.479   0.632
activity_tot_s                      -0.009   0.008   -1.086   0.277
social_tot_s                        -0.016   0.006   -2.687   0.007
physical_tot_s                       0.003   0.003    0.788   0.431
ema_beep                            -0.011   0.002   -4.569   0.000
SexMale                             -0.073   0.020   -3.576   0.000
physical_excercise_dur               0.109   0.030    3.660   0.000
acc_delta                            0.022   0.001   19.155   0.000
temp_mean_z                          0.016   0.007    2.256   0.024
temp_slope_z                         0.009   0.006    1.422   0.155
event_tot_s:activity_tot_s          -0.001   0.001   -0.787   0.431
activity_tot_s:social_tot_s          0.002   0.001    2.188   0.029
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.014   
  castor_record_id        activity_tot_s         0.012   
  castor_record_id         social_tot_s          0.013   
  castor_record_id        physical_tot_s         0.021   
 castor_record_id.1          ema_beep            0.013   
 castor_record_id.2        temp_slope_z          0.035   
 castor_record_id.3        temp_mean_z           0.045   
 castor_record_id.4         acc_delta            0.007   
 castor_record_id.5   physical_excercise_dur     0.135   
      Residual                                   0.208   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.003 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 4.58         2.14
           social_tot_s 4.91         2.22
         physical_tot_s 1.12         1.06
               ema_beep 1.05         1.02
                    Sex 1.00         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.03         1.01
           temp_slope_z 1.01         1.00

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 14.83         3.85
  event_tot_s:activity_tot_s 20.81         4.56
 activity_tot_s:social_tot_s 11.81         3.44

Max

# Model
# glmer.hr_max_ema <- glmer(hr_max_s ~
#     event_tot_s*activity_tot_s + activity_tot_s*social_tot_s + physical_tot_s +
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex +  physical_excercise_dur + acc_delta +
#     temp_mean_z + temp_slope_z + 
#     (0+event_tot_s+activity_tot_s+social_tot_s+physical_tot_s | castor_record_id) + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE) )
# Model Summary
model_output(glmer.hr_max_ema)
MODEL INFO:
Observations: 4419
Dependent Variable: hr_max_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 11315.568, BIC = 11500.984
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-------------------------------------------------------------------
                                      Est.    S.E.   t val.       p
--------------------------------- -------- ------- -------- -------
(Intercept)                          3.392   0.166   20.383   0.000
event_tot_s                          0.024   0.027    0.879   0.379
activity_tot_s                       0.025   0.033    0.748   0.455
social_tot_s                        -0.007   0.024   -0.276   0.783
physical_tot_s                       0.011   0.013    0.846   0.397
ema_beep                            -0.056   0.010   -5.797   0.000
SexMale                              0.159   0.068    2.337   0.019
physical_excercise_dur               0.337   0.134    2.515   0.012
acc_delta                            0.174   0.006   28.427   0.000
temp_mean_z                         -0.241   0.029   -8.302   0.000
temp_slope_z                         0.024   0.030    0.811   0.417
event_tot_s:activity_tot_s          -0.004   0.005   -0.830   0.406
activity_tot_s:social_tot_s          0.001   0.004    0.129   0.898
-------------------------------------------------------------------

RANDOM EFFECTS:
---------------------------------------------------------
       Group                Parameter          Std. Dev. 
-------------------- ------------------------ -----------
  castor_record_id         event_tot_s           0.074   
  castor_record_id        activity_tot_s         0.050   
  castor_record_id         social_tot_s          0.067   
  castor_record_id        physical_tot_s         0.066   
 castor_record_id.1          ema_beep            0.042   
 castor_record_id.2        temp_slope_z          0.169   
 castor_record_id.3        temp_mean_z           0.188   
 castor_record_id.4         acc_delta            0.036   
 castor_record_id.5   physical_excercise_dur     0.657   
      Residual                                   0.219   
---------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.010 
-------------------------------------
Model has interaction terms. VIFs might be inflated. You may check multicollinearity among predictors of a model without interaction terms.
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
            event_tot_s 4.88         2.21
           social_tot_s 4.54         2.13
         physical_tot_s 1.14         1.07
               ema_beep 1.06         1.03
                    Sex 1.01         1.00
 physical_excercise_dur 1.00         1.00
              acc_delta 1.02         1.01
            temp_mean_z 1.04         1.02
           temp_slope_z 1.01         1.00

High Correlation

                   Parameter   VIF Increased SE
              activity_tot_s 16.25         4.03
  event_tot_s:activity_tot_s 23.81         4.88
 activity_tot_s:social_tot_s 12.09         3.48

4.2.4 Table: Subjective Stress and Outcomes

table.physio_beep <- tab_model(glmer.sc_ton_ema, glmer.sc_ph_num_ema, glmer.sc_ph_mag_ema, glmer.sc_ph_auc_ema, 
            glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema, 
          dv.labels=c("SC Tonic", "SC Number", "SC Magnitude", "SC AUC", "Mean", "Min", "Max"), 
          title="Table X. Momentary Physiology and Subjective Stress",
            transform=NULL, p.adjust="fdr", 
         show.stat=TRUE,
         show.se=TRUE) 
htmlTable::htmlTable(table.physio_beep$knitr)
Table X. Momentary Physiology and Subjective Stress
  SC Tonic SC Number SC Magnitude SC AUC Mean Min Max
Predictors Estimates std. Error CI Statistic p Log-Mean std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) -0.00 0.05 -0.11 – 0.10 -0.09 0.993 2.01 0.11 1.78 – 2.23 17.69 <0.001 1.34 0.16 1.01 – 1.66 8.12 <0.001 1.06 0.16 0.75 – 1.37 6.70 <0.001 3.21 0.12 2.97 – 3.44 26.73 <0.001 1.34 0.04 1.26 – 1.42 32.42 <0.001 3.39 0.17 3.07 – 3.72 20.38 <0.001
event_tot_s 0.01 0.01 -0.00 – 0.03 1.50 0.289 0.04 0.03 -0.02 – 0.10 1.35 0.230 0.07 0.03 0.02 – 0.12 2.67 0.016 0.02 0.02 -0.03 – 0.07 0.78 0.516 0.02 0.02 -0.02 – 0.06 1.11 0.347 0.00 0.01 -0.01 – 0.02 0.48 0.632 0.02 0.03 -0.03 – 0.08 0.88 0.537
activity_tot_s 0.01 0.01 -0.01 – 0.04 1.29 0.366 0.08 0.04 0.01 – 0.16 2.20 0.045 0.07 0.03 0.01 – 0.13 2.16 0.046 0.03 0.03 -0.03 – 0.09 0.98 0.501 -0.01 0.02 -0.05 – 0.04 -0.27 0.786 -0.01 0.01 -0.02 – 0.01 -1.09 0.361 0.02 0.03 -0.04 – 0.09 0.75 0.537
social_tot_s 0.00 0.01 -0.02 – 0.02 0.01 0.993 0.03 0.03 -0.03 – 0.09 0.90 0.396 -0.00 0.02 -0.05 – 0.04 -0.18 0.931 0.01 0.02 -0.03 – 0.06 0.64 0.563 -0.03 0.02 -0.06 – 0.01 -1.46 0.236 -0.02 0.01 -0.03 – -0.00 -2.69 0.016 -0.01 0.02 -0.05 – 0.04 -0.28 0.848
physical_tot_s -0.00 0.00 -0.01 – 0.01 -0.53 0.869 0.04 0.03 -0.02 – 0.09 1.16 0.293 0.03 0.01 0.00 – 0.05 2.14 0.046 0.01 0.01 -0.01 – 0.03 1.00 0.501 0.02 0.01 0.00 – 0.04 2.26 0.052 0.00 0.00 -0.00 – 0.01 0.79 0.467 0.01 0.01 -0.01 – 0.04 0.85 0.537
ema_beep 0.00 0.00 -0.00 – 0.01 0.43 0.869 -0.05 0.02 -0.10 – -0.00 -2.14 0.047 -0.00 0.01 -0.02 – 0.02 -0.07 0.944 0.01 0.01 -0.01 – 0.03 1.09 0.501 -0.04 0.01 -0.06 – -0.03 -5.65 <0.001 -0.01 0.00 -0.02 – -0.01 -4.57 <0.001 -0.06 0.01 -0.08 – -0.04 -5.80 <0.001
Sex [Male] 0.00 0.02 -0.04 – 0.04 0.06 0.993 0.84 0.11 0.62 – 1.07 7.36 <0.001 0.04 0.07 -0.10 – 0.18 0.58 0.728 0.03 0.06 -0.10 – 0.15 0.46 0.647 0.02 0.06 -0.11 – 0.15 0.31 0.786 -0.07 0.02 -0.11 – -0.03 -3.58 0.001 0.16 0.07 0.03 – 0.29 2.34 0.042
physical_excercise_dur 0.08 0.05 -0.01 – 0.18 1.69 0.261 -0.20 0.41 -1.00 – 0.60 -0.48 0.630 0.36 0.13 0.11 – 0.62 2.79 0.014 0.22 0.11 -0.00 – 0.45 1.96 0.130 0.36 0.08 0.20 – 0.52 4.48 <0.001 0.11 0.03 0.05 – 0.17 3.66 0.001 0.34 0.13 0.07 – 0.60 2.52 0.031
acc_delta 0.02 0.00 0.01 – 0.02 9.52 <0.001 0.23 0.01 0.20 – 0.26 16.04 <0.001 0.11 0.01 0.10 – 0.12 18.21 <0.001 0.12 0.01 0.10 – 0.13 16.35 <0.001 0.14 0.00 0.13 – 0.15 29.56 <0.001 0.02 0.00 0.02 – 0.02 19.15 <0.001 0.17 0.01 0.16 – 0.19 28.43 <0.001
temp_mean_z 0.04 0.01 0.02 – 0.06 4.49 <0.001 0.43 0.09 0.25 – 0.61 4.71 <0.001 0.12 0.02 0.07 – 0.17 4.81 <0.001 0.12 0.03 0.07 – 0.17 4.71 <0.001 -0.09 0.02 -0.13 – -0.05 -4.07 <0.001 0.02 0.01 0.00 – 0.03 2.26 0.045 -0.24 0.03 -0.30 – -0.18 -8.30 <0.001
temp_slope_z 0.03 0.01 0.01 – 0.05 2.84 0.020 0.22 0.07 0.09 – 0.36 3.24 0.003 0.07 0.02 0.03 – 0.11 3.23 0.004 0.07 0.02 0.03 – 0.12 3.04 0.008 0.03 0.02 -0.01 – 0.07 1.56 0.222 0.01 0.01 -0.00 – 0.02 1.42 0.224 0.02 0.03 -0.03 – 0.08 0.81 0.537
event_tot_s *
activity_tot_s
-0.00 0.00 -0.01 – 0.00 -1.64 0.261 -0.01 0.00 -0.02 – -0.00 -2.78 0.010 -0.01 0.00 -0.02 – -0.00 -2.45 0.027 -0.00 0.00 -0.01 – 0.01 -0.78 0.516 -0.00 0.00 -0.01 – 0.00 -0.72 0.554 -0.00 0.00 -0.00 – 0.00 -0.79 0.467 -0.00 0.01 -0.01 – 0.01 -0.83 0.537
activity_tot_s *
social_tot_s
-0.00 0.00 -0.00 – 0.00 -0.45 0.869 -0.01 0.00 -0.02 – -0.01 -3.92 <0.001 -0.00 0.00 -0.01 – 0.01 -0.32 0.883 -0.00 0.00 -0.01 – 0.00 -0.94 0.501 0.00 0.00 -0.00 – 0.01 1.21 0.327 0.00 0.00 0.00 – 0.00 2.19 0.047 0.00 0.00 -0.01 – 0.01 0.13 0.898
N 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id
Observations 4565 4565 4565 4565 4419 4419 4419

4.2.5 Plot: Outcomes v Subjective Stress

Next I want to plot our outcomes as a function of the subjective stress. I will do this in separate graphs for event, activity, social, and physical stress. This gets a little complicated though. So I will make each graph separately, and then combine them outside of R to make sure they still look good.

# Shorrtlist the variables to those of interest
plot.vars <- plot_models(glmer.posmood_beep, glmer.sc_ph_num_ema, glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema)
# Get and filter terms
full_term <- as.vector(plot.vars$data$term[1:length(plot.vars$data$term)])
event_term <- full_term[full_term != "event_tot_s"]
activ_term <-full_term[full_term != "activity_tot_s"]
soc_term <- full_term[full_term != "social_tot_s"]
phy_term <- full_term[full_term != "physical_tot_s"]
# Set the colours
col_list <-c('#7570B3','#7570B3','#7570B3',"#D95F02", "#D95F02", '#D95F02', '#D95F02', "#1B9E77", "#1B9E77")
# Event Plot
plot.event_substr <- plot_models(glmer.posmood_beep, glmer.negmood_beep, 
            glmer.sc_ton_ema, glmer.sc_ph_num_ema, glmer.sc_ph_mag_ema, glmer.sc_ph_auc_ema, 
            glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema, 
            m.labels=c("Positive Affect", "Negative Affect", "SC Tonic", "SC Number", "SC Magnitued", "SC AUC", "HR Mean", "HR Minimum", "HR Maximum"),
            axis.labels = c(""), 
            # Stastistical Stuff
            rm.terms = event_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size = 0.5,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + 
            theme(axis.ticks.y=element_blank(), 
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
plot.event_substr <- plot.event_substr+ coord_flip(ylim=c(0.75,1.25)) +  coord_flip(ylim=c(-0.5,0.5)) + theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
ggsave("figures/fig_StrResid_Event.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")
# Act Plot
plot.activity_substr <-  plot_models(glmer.posmood_beep, glmer.negmood_beep, 
            glmer.sc_ton_ema, glmer.sc_ph_num_ema, glmer.sc_ph_mag_ema, glmer.sc_ph_auc_ema, 
            glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema, 
            m.labels=c("Positive Affect", "Negative Affect", "SC Tonic", "SC Number", "SC Magnitued", "SC AUC", "HR Mean", "HR Minimum", "HR Maximum"),
            axis.labels = c(""), 
            # Stastistical Stuff
            rm.terms = activ_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size = 0.5,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + 
              theme(axis.ticks.y=element_blank(), 
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
plot.activity_substr <- plot.activity_substr+ coord_flip(ylim=c(0.75,1.25)) +  coord_flip(ylim=c(-0.5,0.5)) + theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())
ggsave("figures/fig_StrResid_Activity.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")
# Social Stress
plot.social_substr <-  plot_models(glmer.posmood_beep, glmer.negmood_beep, 
            glmer.sc_ton_ema, glmer.sc_ph_num_ema, glmer.sc_ph_mag_ema, glmer.sc_ph_auc_ema, 
            glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema, 
            m.labels=c("Positive Affect", "Negative Affect", "SC Tonic", "SC Number", "SC Magnitued", "SC AUC", "HR Mean", "HR Minimum", "HR Maximum"),
            axis.labels = c(""), 
            # Stastistical Stuff
            rm.terms = soc_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size = 0.5,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + 
            theme(axis.ticks.y=element_blank(), 
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
## Plot
plot.social_substr <- plot.social_substr + coord_flip(ylim=c(0.75,1.25)) +  coord_flip(ylim=c(-0.5,0.5)) + theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())
ggsave("figures/fig_StrResid_Social.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")
# Physical Stress
plot.physical_substr <- plot_models(glmer.posmood_beep, glmer.negmood_beep, 
            glmer.sc_ton_ema, glmer.sc_ph_num_ema, glmer.sc_ph_mag_ema, glmer.sc_ph_auc_ema, 
            glmer.hr_mean_ema, glmer.hr_min_ema, glmer.hr_max_ema, 
            m.labels=c("Positive Affect", "Negative Affect", "SC Tonic", "SC Number", "SC Magnitued", "SC AUC", "HR Mean", "HR Minimum", "HR Maximum"),
            axis.labels = c(""), 
            # Stastistical Stuff
            rm.terms = phy_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size =0.5,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + 
              theme(axis.ticks.y=element_blank(), 
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
# Plot
plot.physical_substr <- plot.physical_substr +  coord_flip(ylim=c(-0.5,0.5), xlim=c(1,1.1)) + theme(panel.grid.major.y = element_blank(), panel.grid.minor.y = element_blank())
ggsave("figures/fig_StrResid_Physical.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw', bg="transparent")
# All
ggarrange(plot.event_substr, plot.activity_substr, plot.social_substr, plot.physical_substr, common.legend = T, legend="right")

ggsave("figures/fig_StrResid_MAT.tiff", units="in", width=7, height=7, dpi=300, compression = 'lzw', bg="transparent")

4.3 Mood and Physiology

Arousal is not a valence specific mechanism. In the stress week, we see that there is a reduction in our physiological arousal measures, but also in positive affect. To this end, we check the relationship between physiology and the mood items. We expect that while arousal measures are indeed associated with stress, they are also associated with positive mood. To this end, we model these relationships with both positive and negative affect. We use a maximal fitting approach as before. We see a high correlation between positive and negative mood (presented below), and therefore also model interaction terms here. Due to model convergence issues, we only model the fixed intercepts here for the fixed effects of interest. Again, we check all model families before we pick the one with the best fit.

 rcorr(as.matrix(EMA_Data[,c("mood_positive_s", "mood_negative_s")]))
                mood_positive_s mood_negative_s
mood_positive_s            1.00           -0.57
mood_negative_s           -0.57            1.00

n= 5735 


P
                mood_positive_s mood_negative_s
mood_positive_s                  0             
mood_negative_s  0                             

4.3.1 Skin Conductance

Mean

# Model
# glmer.sc_ton_mood <- glmer(sc_tonic_mean_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (0+mood_positive_s*mood_negative_s| castor_record_id) +# + (1+mood_negative_s|castor_record_id)+
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.sc_ton_mood)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_tonic_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 773.006, BIC = 914.382
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              0.030   0.045    0.675   0.500
mood_positive_s                          0.006   0.007    0.846   0.398
mood_negative_s                         -0.002   0.012   -0.145   0.885
ema_beep                                 0.001   0.003    0.252   0.801
SexMale                                 -0.012   0.020   -0.637   0.524
temp_slope_z                             0.029   0.010    2.934   0.003
temp_mean_z                              0.042   0.009    4.532   0.000
acc_delta                                0.019   0.002    9.752   0.000
physical_excercise_dur                   0.082   0.050    1.631   0.103
mood_positive_s:mood_negative_s         -0.001   0.002   -0.554   0.580
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id            mood_positive_s             0.017   
  castor_record_id            mood_negative_s             0.035   
  castor_record_id    mood_positive_s:mood_negative_s     0.011   
 castor_record_id.1              ema_beep                 0.016   
 castor_record_id.2            temp_slope_z               0.065   
 castor_record_id.3             temp_mean_z               0.062   
 castor_record_id.4              acc_delta                0.014   
 castor_record_id.5       physical_excercise_dur          0.299   
      Residual                                            0.287   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.002 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                       Parameter  VIF Increased SE
                 mood_positive_s 2.96         1.72
                        ema_beep 1.02         1.01
                             Sex 1.01         1.00
                    temp_slope_z 1.00         1.00
                     temp_mean_z 1.01         1.01
                       acc_delta 1.01         1.00
          physical_excercise_dur 1.00         1.00
 mood_positive_s:mood_negative_s 4.88         2.21

Moderate Correlation

       Parameter  VIF Increased SE
 mood_negative_s 6.44         2.54

Number

# Model
# glmer.sc_phnum_mood <- glmer(sc_phasic_num_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id) +# + (1+mood_negative_s|castor_record_id)+
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.sc_phnum_mood)
MODEL INFO:
Observations: 4565
Dependent Variable: log(sc_phasic_num_s)
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 7580.862, BIC = 7747.943
Pseudo-R² (fixed effects) = 0.202
Pseudo-R² (total) = 0.331 

FIXED EFFECTS:
---------------------------------------------------------------------------------
                                          Est.    S.E.   t val.      d.f.       p
------------------------------------- -------- ------- -------- --------- -------
(Intercept)                              0.232   0.086    2.690   205.786   0.008
mood_positive_s                          0.029   0.011    2.555   343.443   0.011
mood_negative_s                          0.037   0.020    1.842    54.171   0.071
ema_beep                                -0.017   0.005   -3.013   133.440   0.003
SexMale                                  0.073   0.057    1.273    67.946   0.207
temp_slope_z                             0.036   0.009    4.016     5.496   0.008
temp_mean_z                              0.074   0.015    4.874    63.065   0.000
acc_delta                                0.056   0.003   17.256    85.710   0.000
physical_excercise_dur                   0.084   0.061    1.378    64.266   0.173
mood_positive_s:mood_negative_s         -0.006   0.004   -1.502    40.417   0.141
---------------------------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.178   
  castor_record_id            mood_positive_s             0.011   
  castor_record_id            mood_negative_s             0.042   
  castor_record_id    mood_positive_s:mood_negative_s     0.013   
 castor_record_id.1              ema_beep                 0.022   
 castor_record_id.2            temp_slope_z               0.017   
 castor_record_id.3             temp_mean_z               0.091   
 castor_record_id.4              acc_delta                0.023   
 castor_record_id.5       physical_excercise_dur          0.162   
      Residual                                            0.523   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.093 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                       Parameter  VIF Increased SE
                 mood_positive_s 3.03         1.74
                        ema_beep 1.02         1.01
                             Sex 1.00         1.00
                    temp_slope_z 1.01         1.00
                     temp_mean_z 1.02         1.01
                       acc_delta 1.02         1.01
          physical_excercise_dur 1.00         1.00
 mood_positive_s:mood_negative_s 3.89         1.97

Moderate Correlation

       Parameter  VIF Increased SE
 mood_negative_s 5.76         2.40

Magnitude

# Model
# glmer.sc_ph_mag_mood <- glmer(sc_phasic_mag_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + 
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id)  + 
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#    family=Gamma(link="identity"),
#     control=glmerControl(calc.derivs = FALSE, optCtrl=list(maxfun=100000) ))
# Summary
model_output(glmer.sc_ph_mag_mood)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_mag_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: identity 

MODEL FIT:
AIC = 11181.350, BIC = 11348.431
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              1.571   0.160    9.802   0.000
mood_positive_s                          0.035   0.022    1.640   0.101
mood_negative_s                          0.029   0.035    0.831   0.406
ema_beep                                -0.006   0.009   -0.687   0.492
SexMale                                  0.020   0.077    0.259   0.796
temp_slope_z                             0.070   0.021    3.355   0.001
temp_mean_z                              0.126   0.024    5.217   0.000
acc_delta                                0.104   0.006   17.239   0.000
physical_excercise_dur                   0.348   0.127    2.731   0.006
mood_positive_s:mood_negative_s         -0.006   0.007   -0.802   0.423
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.679   
  castor_record_id            mood_positive_s             0.084   
  castor_record_id            mood_negative_s             0.116   
  castor_record_id    mood_positive_s:mood_negative_s     0.035   
 castor_record_id.1              ema_beep                 0.039   
 castor_record_id.2            temp_slope_z               0.086   
 castor_record_id.3             temp_mean_z               0.144   
 castor_record_id.4              acc_delta                0.039   
 castor_record_id.5       physical_excercise_dur          0.603   
      Residual                                            0.408   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.451 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                       Parameter  VIF Increased SE
                 mood_positive_s 3.37         1.84
                        ema_beep 1.02         1.01
                             Sex 1.01         1.00
                    temp_slope_z 1.01         1.00
                     temp_mean_z 1.02         1.01
                       acc_delta 1.01         1.01
          physical_excercise_dur 1.00         1.00
 mood_positive_s:mood_negative_s 3.37         1.83

Moderate Correlation

       Parameter  VIF Increased SE
 mood_negative_s 5.85         2.42

AUC

# Model
# glmer.sc_ph_auc_mood <- glmer(sc_phasic_auc_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + 
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id)  +
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.sc_ph_auc_mood)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_auc_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 9834.225, BIC = 10001.306
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              0.231   0.109    2.126   0.033
mood_positive_s                          0.014   0.015    0.925   0.355
mood_negative_s                          0.013   0.025    0.505   0.614
ema_beep                                -0.007   0.006   -1.183   0.237
SexMale                                  0.010   0.045    0.211   0.833
temp_slope_z                             0.046   0.015    3.082   0.002
temp_mean_z                              0.091   0.016    5.536   0.000
acc_delta                                0.047   0.003   15.960   0.000
physical_excercise_dur                   0.063   0.069    0.911   0.362
mood_positive_s:mood_negative_s         -0.004   0.005   -0.779   0.436
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.596   
  castor_record_id            mood_positive_s             0.078   
  castor_record_id            mood_negative_s             0.124   
  castor_record_id    mood_positive_s:mood_negative_s     0.025   
 castor_record_id.1              ema_beep                 0.029   
 castor_record_id.2            temp_slope_z               0.091   
 castor_record_id.3             temp_mean_z               0.111   
 castor_record_id.4              acc_delta                0.021   
 castor_record_id.5       physical_excercise_dur          0.312   
      Residual                                            0.492   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.496 
-------------------------------------
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
        mood_positive_s 3.68         1.92
               ema_beep 1.02         1.01
                    Sex 1.01         1.00
           temp_slope_z 1.01         1.00
            temp_mean_z 1.02         1.01
              acc_delta 1.01         1.01
 physical_excercise_dur 1.00         1.00

Moderate Correlation

                       Parameter  VIF Increased SE
                 mood_negative_s 8.71         2.95
 mood_positive_s:mood_negative_s 5.05         2.25

4.3.2 Heart Rate

Mean

# glmer.hr_mean_mood <- glmer(hr_mean_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id)  + # (1+mood_positive_s| castor_record_id) + (1+mood_negative_s|castor_record_id)+
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.hr_mean_mood )
MODEL INFO:
Observations: 4419
Dependent Variable: hr_mean_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 8547.250, BIC = 8713.485
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              1.104   0.039   28.317   0.000
mood_positive_s                          0.015   0.005    2.830   0.005
mood_negative_s                          0.012   0.009    1.346   0.178
ema_beep                                -0.016   0.002   -7.690   0.000
SexMale                                 -0.055   0.020   -2.714   0.007
temp_slope_z                             0.007   0.005    1.248   0.212
temp_mean_z                             -0.031   0.006   -4.811   0.000
acc_delta                                0.033   0.001   26.656   0.000
physical_excercise_dur                   0.092   0.025    3.657   0.000
mood_positive_s:mood_negative_s         -0.002   0.001   -1.063   0.288
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.209   
  castor_record_id            mood_positive_s             0.026   
  castor_record_id            mood_negative_s             0.040   
  castor_record_id    mood_positive_s:mood_negative_s     0.007   
 castor_record_id.1              ema_beep                 0.011   
 castor_record_id.2            temp_slope_z               0.028   
 castor_record_id.3             temp_mean_z               0.045   
 castor_record_id.4              acc_delta                0.009   
 castor_record_id.5       physical_excercise_dur          0.111   
      Residual                                            0.177   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.483 
-------------------------------------
# Check for Multicollinearity

Low Correlation

              Parameter  VIF Increased SE
        mood_positive_s 3.36         1.83
               ema_beep 1.02         1.01
                    Sex 1.01         1.00
           temp_slope_z 1.01         1.00
            temp_mean_z 1.02         1.01
              acc_delta 1.01         1.01
 physical_excercise_dur 1.00         1.00

Moderate Correlation

                       Parameter  VIF Increased SE
                 mood_negative_s 8.10         2.85
 mood_positive_s:mood_negative_s 5.29         2.30

Min

# glmer.hr_min_mood <- glmer(hr_min_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id)  + # (1+mood_positive_s| castor_record_id) + (1+mood_negative_s|castor_record_id)+
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#     control=glmerControl(calc.derivs = FALSE) )
# Summary
model_output(glmer.hr_min_mood )
MODEL INFO:
Observations: 4419
Dependent Variable: hr_min_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 10277.446, BIC = 10443.682
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              1.172   0.043   26.968   0.000
mood_positive_s                          0.015   0.006    2.554   0.011
mood_negative_s                          0.009   0.010    0.920   0.358
ema_beep                                -0.011   0.002   -4.680   0.000
SexMale                                 -0.084   0.023   -3.591   0.000
temp_slope_z                             0.010   0.006    1.503   0.133
temp_mean_z                              0.020   0.007    2.782   0.005
acc_delta                                0.022   0.001   18.734   0.000
physical_excercise_dur                   0.105   0.030    3.540   0.000
mood_positive_s:mood_negative_s         -0.001   0.002   -0.751   0.452
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.214   
  castor_record_id            mood_positive_s             0.027   
  castor_record_id            mood_negative_s             0.043   
  castor_record_id    mood_positive_s:mood_negative_s     0.007   
 castor_record_id.1              ema_beep                 0.010   
 castor_record_id.2            temp_slope_z               0.035   
 castor_record_id.3             temp_mean_z               0.047   
 castor_record_id.4              acc_delta                0.007   
 castor_record_id.5       physical_excercise_dur          0.135   
      Residual                                            0.208   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.414 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                       Parameter  VIF Increased SE
                 mood_positive_s 3.12         1.77
                        ema_beep 1.03         1.01
                             Sex 1.01         1.00
                    temp_slope_z 1.01         1.00
                     temp_mean_z 1.02         1.01
                       acc_delta 1.02         1.01
          physical_excercise_dur 1.00         1.00
 mood_positive_s:mood_negative_s 4.84         2.20

Moderate Correlation

       Parameter  VIF Increased SE
 mood_negative_s 7.11         2.67

Max

# glmer.hr_max_mood <- glmer(hr_max_s ~ mood_positive_s*mood_negative_s + 
#     ema_beep + # I will model the beep to factor circadian rhythms
#     Sex + temp_slope_z + temp_mean_z + 
#     acc_delta + physical_excercise_dur +
#     (1+mood_positive_s*mood_negative_s| castor_record_id)  + # (1+mood_positive_s| castor_record_id) + (1+mood_negative_s|castor_record_id)+
#     (0+ema_beep|castor_record_id)+
#     (0+temp_slope_z|castor_record_id) + (0+temp_mean_z|castor_record_id)+
#     (0+acc_delta|castor_record_id) + (0+physical_excercise_dur|castor_record_id),
#     EMA_Data,
#     family=Gamma(link="log"),
#    control=glmerControl(calc.derivs = FALSE, #, optimizer="Nelder_Mead",
#                          optCtrl=list(maxfun=100000)) )
# Summary
model_output(glmer.hr_max_mood )
MODEL INFO:
Observations: 4419
Dependent Variable: hr_max_s
Type: Mixed effects generalized linear regression
Error Distribution: Gamma
Link function: log 

MODEL FIT:
AIC = 11629.004, BIC = 11795.240
Pseudo-R² (fixed effects) =   NA
Pseudo-R² (total) =   NA 

FIXED EFFECTS:
-----------------------------------------------------------------------
                                          Est.    S.E.   t val.       p
------------------------------------- -------- ------- -------- -------
(Intercept)                              1.197   0.043   27.672   0.000
mood_positive_s                          0.015   0.006    2.557   0.011
mood_negative_s                          0.014   0.009    1.621   0.105
ema_beep                                -0.017   0.003   -6.812   0.000
SexMale                                  0.019   0.017    1.093   0.275
temp_slope_z                             0.003   0.007    0.434   0.664
temp_mean_z                             -0.065   0.007   -8.822   0.000
acc_delta                                0.033   0.001   25.960   0.000
physical_excercise_dur                   0.073   0.034    2.149   0.032
mood_positive_s:mood_negative_s         -0.002   0.002   -1.405   0.160
-----------------------------------------------------------------------

RANDOM EFFECTS:
------------------------------------------------------------------
       Group                     Parameter              Std. Dev. 
-------------------- --------------------------------- -----------
  castor_record_id              (Intercept)               0.202   
  castor_record_id            mood_positive_s             0.029   
  castor_record_id            mood_negative_s             0.027   
  castor_record_id    mood_positive_s:mood_negative_s     0.005   
 castor_record_id.1              ema_beep                 0.011   
 castor_record_id.2            temp_slope_z               0.033   
 castor_record_id.3             temp_mean_z               0.049   
 castor_record_id.4              acc_delta                0.008   
 castor_record_id.5       physical_excercise_dur          0.169   
      Residual                                            0.226   
------------------------------------------------------------------

Grouping variables:
-------------------------------------
      Group         # groups    ICC  
------------------ ---------- -------
 castor_record_id      82      0.330 
-------------------------------------
# Check for Multicollinearity

Low Correlation

                       Parameter  VIF Increased SE
                 mood_positive_s 3.19         1.79
                        ema_beep 1.02         1.01
                             Sex 1.01         1.01
                    temp_slope_z 1.01         1.00
                     temp_mean_z 1.02         1.01
                       acc_delta 1.01         1.01
          physical_excercise_dur 1.00         1.00
 mood_positive_s:mood_negative_s 4.92         2.22

Moderate Correlation

       Parameter  VIF Increased SE
 mood_negative_s 7.64         2.76

4.3.3 Results: Mood and Physiology

table.physio_mood <- tab_model(glmer.sc_ton_mood, glmer.sc_phnum_mood, glmer.sc_ph_mag_mood, glmer.sc_ph_auc_mood,
                glmer.hr_mean_mood, glmer.hr_min_mood, glmer.hr_max_mood,
          dv.labels=c("SC Tonic", "SC Number", "SC Magnitude", "SC AUC", "HR Mean", "HR Min", "HR Max"), 
          title="Table X. Physio vs. Mood",
            transform=NULL, p.adjust="fdr", 
         show.stat=TRUE,
         show.se=TRUE)
htmlTable::htmlTable(table.physio_mood$knitr)
Table X. Physio vs. Mood
  SC Tonic SC Number SC Magnitude SC AUC HR Mean HR Min HR Max
Predictors Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p Estimates std. Error CI Statistic p
(Intercept) 0.03 0.04 -0.06 – 0.12 0.67 0.724 0.23 0.09 0.06 – 0.40 2.69 0.014 1.57 0.16 1.26 – 1.88 9.80 <0.001 0.23 0.11 0.02 – 0.44 2.13 0.084 1.10 0.04 1.03 – 1.18 28.32 <0.001 1.17 0.04 1.09 – 1.26 26.97 <0.001 1.20 0.04 1.11 – 1.28 27.67 <0.001
mood_positive_s 0.01 0.01 -0.01 – 0.02 0.85 0.724 0.03 0.01 0.01 – 0.05 2.55 0.018 0.04 0.02 -0.01 – 0.08 1.64 0.168 0.01 0.01 -0.02 – 0.04 0.93 0.518 0.01 0.01 0.00 – 0.02 2.83 0.008 0.01 0.01 0.00 – 0.03 2.55 0.015 0.02 0.01 0.00 – 0.03 2.56 0.021
mood_negative_s -0.00 0.01 -0.02 – 0.02 -0.14 0.885 0.04 0.02 -0.00 – 0.08 1.84 0.094 0.03 0.04 -0.04 – 0.10 0.83 0.528 0.01 0.03 -0.04 – 0.06 0.50 0.682 0.01 0.01 -0.01 – 0.03 1.35 0.223 0.01 0.01 -0.01 – 0.03 0.92 0.397 0.01 0.01 -0.00 – 0.03 1.62 0.150
ema_beep 0.00 0.00 -0.01 – 0.01 0.25 0.885 -0.02 0.01 -0.03 – -0.01 -3.01 0.006 -0.01 0.01 -0.02 – 0.01 -0.69 0.547 -0.01 0.01 -0.02 – 0.00 -1.18 0.473 -0.02 0.00 -0.02 – -0.01 -7.69 <0.001 -0.01 0.00 -0.02 – -0.01 -4.68 <0.001 -0.02 0.00 -0.02 – -0.01 -6.81 <0.001
Sex [Male] -0.01 0.02 -0.05 – 0.03 -0.64 0.724 0.07 0.06 -0.04 – 0.18 1.27 0.203 0.02 0.08 -0.13 – 0.17 0.26 0.796 0.01 0.05 -0.08 – 0.10 0.21 0.833 -0.05 0.02 -0.09 – -0.02 -2.71 0.010 -0.08 0.02 -0.13 – -0.04 -3.59 0.001 0.02 0.02 -0.02 – 0.05 1.09 0.305
temp_slope_z 0.03 0.01 0.01 – 0.05 2.93 0.011 0.04 0.01 0.02 – 0.05 4.02 <0.001 0.07 0.02 0.03 – 0.11 3.35 0.002 0.05 0.01 0.02 – 0.08 3.08 0.007 0.01 0.01 -0.00 – 0.02 1.25 0.236 0.01 0.01 -0.00 – 0.02 1.50 0.166 0.00 0.01 -0.01 – 0.02 0.43 0.664
temp_mean_z 0.04 0.01 0.02 – 0.06 4.53 <0.001 0.07 0.02 0.04 – 0.10 4.87 <0.001 0.13 0.02 0.08 – 0.17 5.22 <0.001 0.09 0.02 0.06 – 0.12 5.54 <0.001 -0.03 0.01 -0.04 – -0.02 -4.81 <0.001 0.02 0.01 0.01 – 0.03 2.78 0.009 -0.07 0.01 -0.08 – -0.05 -8.82 <0.001
acc_delta 0.02 0.00 0.02 – 0.02 9.75 <0.001 0.06 0.00 0.05 – 0.06 17.26 <0.001 0.10 0.01 0.09 – 0.12 17.24 <0.001 0.05 0.00 0.04 – 0.05 15.96 <0.001 0.03 0.00 0.03 – 0.04 26.66 <0.001 0.02 0.00 0.02 – 0.02 18.73 <0.001 0.03 0.00 0.03 – 0.04 25.96 <0.001
physical_excercise_dur 0.08 0.05 -0.02 – 0.18 1.63 0.257 0.08 0.06 -0.04 – 0.20 1.38 0.187 0.35 0.13 0.10 – 0.60 2.73 0.013 0.06 0.07 -0.07 – 0.20 0.91 0.518 0.09 0.03 0.04 – 0.14 3.66 0.001 0.11 0.03 0.05 – 0.16 3.54 0.001 0.07 0.03 0.01 – 0.14 2.15 0.053
mood_positive_s *
mood_negative_s
-0.00 0.00 -0.01 – 0.00 -0.55 0.724 -0.01 0.00 -0.01 – 0.00 -1.50 0.166 -0.01 0.01 -0.02 – 0.01 -0.80 0.528 -0.00 0.00 -0.01 – 0.01 -0.78 0.545 -0.00 0.00 -0.00 – 0.00 -1.06 0.288 -0.00 0.00 -0.00 – 0.00 -0.75 0.452 -0.00 0.00 -0.01 – 0.00 -1.41 0.200
Random Effects
σ2   0.27 0.17 0.24 0.03 0.04 0.05
τ00   0.03 castor_record_id 0.46 castor_record_id 0.36 castor_record_id 0.04 castor_record_id 0.05 castor_record_id 0.04 castor_record_id
τ11   0.00 castor_record_id.mood_positive_s 0.01 castor_record_id.mood_positive_s 0.01 castor_record_id.mood_positive_s 0.00 castor_record_id.mood_positive_s 0.00 castor_record_id.mood_positive_s 0.00 castor_record_id.mood_positive_s
  0.00 castor_record_id.mood_negative_s 0.01 castor_record_id.mood_negative_s 0.02 castor_record_id.mood_negative_s 0.00 castor_record_id.mood_negative_s 0.00 castor_record_id.mood_negative_s 0.00 castor_record_id.mood_negative_s
  0.00 castor_record_id.mood_positive_s:mood_negative_s 0.00 castor_record_id.mood_positive_s:mood_negative_s 0.00 castor_record_id.mood_positive_s:mood_negative_s 0.00 castor_record_id.mood_positive_s:mood_negative_s 0.00 castor_record_id.mood_positive_s:mood_negative_s 0.00 castor_record_id.mood_positive_s:mood_negative_s
  0.00 castor_record_id.ema_beep 0.00 castor_record_id.ema_beep 0.00 castor_record_id.ema_beep 0.00 castor_record_id.ema_beep 0.00 castor_record_id.ema_beep 0.00 castor_record_id.ema_beep
  0.00 castor_record_id.temp_slope_z 0.01 castor_record_id.temp_slope_z 0.01 castor_record_id.temp_slope_z 0.00 castor_record_id.temp_slope_z 0.00 castor_record_id.temp_slope_z 0.00 castor_record_id.temp_slope_z
  0.01 castor_record_id.temp_mean_z 0.02 castor_record_id.temp_mean_z 0.01 castor_record_id.temp_mean_z 0.00 castor_record_id.temp_mean_z 0.00 castor_record_id.temp_mean_z 0.00 castor_record_id.temp_mean_z
  0.00 castor_record_id.acc_delta 0.00 castor_record_id.acc_delta 0.00 castor_record_id.acc_delta 0.00 castor_record_id.acc_delta 0.00 castor_record_id.acc_delta 0.00 castor_record_id.acc_delta
  0.03 castor_record_id.physical_excercise_dur 0.36 castor_record_id.physical_excercise_dur 0.10 castor_record_id.physical_excercise_dur 0.01 castor_record_id.physical_excercise_dur 0.02 castor_record_id.physical_excercise_dur 0.03 castor_record_id.physical_excercise_dur
ρ01   1.00 castor_record_id.mood_positive_s -0.73 castor_record_id.mood_positive_s -0.92 castor_record_id.mood_positive_s -0.92 castor_record_id.mood_positive_s -0.87 castor_record_id.mood_positive_s -0.95 castor_record_id.mood_positive_s
  0.59 castor_record_id.mood_negative_s -0.56 castor_record_id.mood_negative_s -0.77 castor_record_id.mood_negative_s -0.79 castor_record_id.mood_negative_s -0.67 castor_record_id.mood_negative_s -0.87 castor_record_id.mood_negative_s
  -0.73 castor_record_id.mood_positive_s:mood_negative_s -0.08 castor_record_id.mood_positive_s:mood_negative_s 0.41 castor_record_id.mood_positive_s:mood_negative_s 0.55 castor_record_id.mood_positive_s:mood_negative_s 0.37 castor_record_id.mood_positive_s:mood_negative_s 0.54 castor_record_id.mood_positive_s:mood_negative_s
ICC     0.40 0.13 0.17 0.18 0.07
N 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id 82 castor_record_id
Observations 4565 4565 4565 4565 4419 4419 4419
Marginal R2 / Conditional R2 NA 0.232 / NA 0.499 / 0.699 0.178 / 0.284 0.450 / 0.543 0.219 / 0.359 0.390 / 0.432
# Subset variables of interests
plot.physio <- plot_models(glmer.sc_ton_mood, glmer.sc_phnum_mood, glmer.hr_mean_mood)
rm_term <- as.vector(plot.physio$data$term[1:97])
rm_term <- rm_term[rm_term != "mood_positive_s" & rm_term!="mood_negative_s"]
# Set the colours
col_list <-c('#7570B3','#7570B3','#7570B3',"#D95F02", "#D95F02", '#D95F02', '#D95F02', "#1B9E77", "#1B9E77")
# Make the plot
plot.pos_mood_resid <- plot_models( glmer.sc_ton_mood, glmer.sc_phnum_mood, glmer.sc_ph_mag_mood, glmer.sc_ph_auc_mood,
                glmer.hr_mean_mood, glmer.hr_min_mood, glmer.hr_max_mood,
              m.labels=c("SC Tonic", "SC Number", "SC Magnitued", "SC AUC","HR Mean", "HR Minimum", "HR Maximum"),
           axis.labels = c(" "),
            # Stastistical Stuff
           transform=NULL,
            rm.terms = rm_term,
            #show.values = T,
            #value.size = 4, 
            #std.est=T, 
            show.p=T,
            p.shape=T,
            p.adjust = "fdr", 
            legend.pval.title = "Significance", 
            # Visual Stuff
            colors=col_list,
            dot.size=2,
            line.size = 1,
            spacing=0.7, 
            vline.color = "darkgrey", 
            legend.title = "") + 
            ptheme + scale_y_continuous(breaks=c( -0.2, -.1,0, .1,.2)) + 
            theme(axis.ticks.y=element_blank(), 
                  axis.title = element_text(size=16),axis.text.x=element_text(size=11),
                  panel.grid.major.x = element_line(colour = "grey95"),
                  panel.grid.minor.x = element_line(colour = "grey90")) 
Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.
# Plot and Save
plot.pos_mood_resid + coord_flip(ylim=c(-.25,.25)) + theme(panel.grid.major.y = element_line(colour = "grey95"), panel.grid.minor.y = element_line(colour = "grey90"))
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
ggsave("figures/fig_MoodkResid_ALL.tiff", units="in", width=5, height=5, dpi=300, compression = 'lzw', bg="transparent")

4.4 Mediation anaylsis

In the stress week, we see a decrease in both positive mood and physiology. However, we also see an increase in stress during this time too. This is confusing given the moment to moment relationship between subjective stress and physiology. One potential explanation is that the physiology is more strongly associate with positive arousal and opposed to negative arousal. So we need to actually confirm that what we see in the stress week (i.e. the physiology arousal decrease) is actually due to the positive mood changes. To this end, we perfrom a mediation analysis. We first need to filter out the nan’s here for some reason though. We cant apply this analysis to mixed level models, so we instead just check the simple models here.

library(mediation)
set.seed(123)
EMA_Sub <- EMA_Data %>% dplyr::select(castor_record_id, Week_Type, sc_phasic_mag_s, sc_phasic_num_s, mood_positive_s, event_tot_s,  Sex, Program, # Model pop differences
    First_Week,  ema_beep_f, ema_day, 
    physical_excercise_dur, acc_delta, 
    temp_mean_z,temp_slope_z) %>% filter(complete.cases(.))

Two arousal measures were reduced in the stress week, but also associated with increased subjective stress. These measures were the number of skin conductance responses and the magnitude of skin conductance responses. So here we will check the mediating effect of positive mood.

4.4.1 SC Number

First we check whether positive mood mediates the effects of week type of the number of responses. We see in the control week, there is a trend with positive affect mediating the number of skin conductace responses.

# Main effe
fit.totaleffect=glmer(sc_phasic_num_s ~ Week_Type + (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
#summary(fit.totaleffect)
# Mediations
fit.mediator=glmer(mood_positive_s ~ Week_Type + (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
#summary(fit.mediator)
# Combined
fit.dv=glmer(sc_phasic_num_s ~ Week_Type*mood_positive_s + (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
#summary(fit.dv)
# Mediation analysis
results1 = mediate(model.m=fit.mediator, model.y=fit.dv, treat='Week_Type', mediator='mood_positive_s', sims=5000, control.value="Control", treat.value="Stress")
summary(results1)

Causal Mediation Analysis 

Quasi-Bayesian Confidence Intervals

Mediator Groups: castor_record_id 

Outcome Groups: castor_record_id 

Output Based on Overall Averages Across Groups 

                         Estimate 95% CI Lower 95% CI Upper p-value    
ACME (control)           -0.02319     -0.04868         0.00   0.063 .  
ACME (treated)           -0.00265     -0.02695         0.02   0.853    
ADE (control)            -0.29650     -0.39639        -0.19  <2e-16 ***
ADE (treated)            -0.27596     -0.37671        -0.17  <2e-16 ***
Total Effect             -0.29915     -0.39452        -0.20  <2e-16 ***
Prop. Mediated (control)  0.07745     -0.00548         0.18   0.063 .  
Prop. Mediated (treated)  0.00823     -0.07346         0.10   0.853    
ACME (average)           -0.01292     -0.03164         0.01   0.172    
ADE (average)            -0.28623     -0.38492        -0.18  <2e-16 ***
Prop. Mediated (average)  0.04284     -0.01825         0.11   0.172    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Sample Size Used: 4565 


Simulations: 5000 

4.4.2 SC Magnitude

We next check the mediating effect of positive affect on skin coductance magnitde. Here we see that the magnitude of the responses is significanlty mediated by positive affect. It seems in both cases, these effects are being driven by the control week.

# Main effect
fit.totaleffect=glmer(sc_phasic_mag_s ~ Week_Type  + (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
summ(fit.totaleffect)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_mag_s
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 13624.92, BIC = 13650.62
Pseudo-R² (fixed effects) = 0.01
Pseudo-R² (total) = 0.17 

FIXED EFFECTS:
--------------------------------------------------------------
                         Est.   S.E.   t val.      d.f.      p
--------------------- ------- ------ -------- --------- ------
(Intercept)              2.38   0.06    42.40     88.10   0.00
Week_TypeStress         -0.18   0.03    -5.72   4503.38   0.00
--------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
--------------------------------------------
      Group          Parameter    Std. Dev. 
------------------ ------------- -----------
 castor_record_id   (Intercept)     0.46    
     Residual                       1.05    
--------------------------------------------

Grouping variables:
------------------------------------
      Group         # groups   ICC  
------------------ ---------- ------
 castor_record_id      82      0.16 
------------------------------------
# Mediations
fit.mediator=glmer(mood_positive_s ~ Week_Type  +  (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
summ(fit.mediator)
MODEL INFO:
Observations: 4565
Dependent Variable: mood_positive_s
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 15525.42, BIC = 15551.12
Pseudo-R² (fixed effects) = 0.02
Pseudo-R² (total) = 0.39 

FIXED EFFECTS:
--------------------------------------------------------------
                         Est.   S.E.   t val.      d.f.      p
--------------------- ------- ------ -------- --------- ------
(Intercept)              6.67   0.11    59.40     85.41   0.00
Week_TypeStress         -0.50   0.04   -13.04   4491.70   0.00
--------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
--------------------------------------------
      Group          Parameter    Std. Dev. 
------------------ ------------- -----------
 castor_record_id   (Intercept)     0.98    
     Residual                       1.28    
--------------------------------------------

Grouping variables:
------------------------------------
      Group         # groups   ICC  
------------------ ---------- ------
 castor_record_id      82      0.37 
------------------------------------
# Combined
fit.dv=glmer(sc_phasic_mag_s ~ Week_Type*mood_positive_s + (1|castor_record_id), EMA_Sub)
calling glmer() with family=gaussian (identity link) as a shortcut to lmer() is deprecated; please call lmer() directly
summ(fit.dv)
MODEL INFO:
Observations: 4565
Dependent Variable: sc_phasic_mag_s
Type: Mixed effects linear regression 

MODEL FIT:
AIC = 13636.39, BIC = 13674.95
Pseudo-R² (fixed effects) = 0.01
Pseudo-R² (total) = 0.17 

FIXED EFFECTS:
------------------------------------------------------------------------------
                                         Est.   S.E.   t val.      d.f.      p
------------------------------------- ------- ------ -------- --------- ------
(Intercept)                              2.15   0.12    18.21   1192.58   0.00
Week_TypeStress                         -0.06   0.13    -0.45   4521.01   0.65
mood_positive_s                          0.03   0.02     2.22   4521.95   0.03
Week_TypeStress:mood_positive_s         -0.02   0.02    -0.83   4525.94   0.41
------------------------------------------------------------------------------

p values calculated using Satterthwaite d.f.

RANDOM EFFECTS:
--------------------------------------------
      Group          Parameter    Std. Dev. 
------------------ ------------- -----------
 castor_record_id   (Intercept)     0.46    
     Residual                       1.05    
--------------------------------------------

Grouping variables:
------------------------------------
      Group         # groups   ICC  
------------------ ---------- ------
 castor_record_id      82      0.16 
------------------------------------
# Mediation analysis
results2 = mediate(model.m=fit.mediator, model.y=fit.dv, treat='Week_Type', mediator='mood_positive_s', boot=F, sims=5000)
treatment and control values do not match factor levels; using Control and Stress as control and treatment, respectively
summary(results2)

Causal Mediation Analysis 

Quasi-Bayesian Confidence Intervals

Mediator Groups: castor_record_id 

Outcome Groups: castor_record_id 

Output Based on Overall Averages Across Groups 

                         Estimate 95% CI Lower 95% CI Upper p-value    
ACME (control)           -0.01736     -0.03336         0.00   0.024 *  
ACME (treated)           -0.00890     -0.02440         0.01   0.266    
ADE (control)            -0.17193     -0.23584        -0.10  <2e-16 ***
ADE (treated)            -0.16347     -0.22774        -0.10  <2e-16 ***
Total Effect             -0.18083     -0.24362        -0.12  <2e-16 ***
Prop. Mediated (control)  0.09583      0.01179         0.21   0.024 *  
Prop. Mediated (treated)  0.04902     -0.03893         0.15   0.266    
ACME (average)           -0.01313     -0.02540         0.00   0.029 *  
ADE (average)            -0.16770     -0.23050        -0.10  <2e-16 ***
Prop. Mediated (average)  0.07242      0.00626         0.16   0.029 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Sample Size Used: 4565 


Simulations: 5000 

5 Random Forests

We were able to establish that physiology and mood both change in the weeks under chronic stress. That is good, because now we can see how well we can use this information in predictive models. To this end, we use the randomForest package plus some extra functions to test our prediction. The point of this analysis is to determine whether was can use the EPA/wristwatch measures on their own to classify which week participants are in, and to additionally check whether this would be as good as asking about mood. Finally, we will see whether the combination of both the mood and EPA measures is actually the best option.

Before we begin, we load the required library, and preset the seed to keep the analysis consistent. We additionally filter out the incomplete datapoints on only keep the full dataset

library(randomForest)
set.seed(123)
# Variables for Forest
vars.forest <- c( "Week_Type", "mood_positive", "mood_negative", "sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "acc_delta", "temp_mean")
vars.forest.physio <-c( "sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "Week_Type" )
# Subset the data
df.RandomForest <- EMA_Data[,vars.forest]
df.RandomForest <- na.omit(df.RandomForest)
df.RandomForest.physio <- df.RandomForest[,vars.forest.physio]

5.1 OOB Error

We first run the first analysis to establish the Out-Of-Bag (OOB) error rate without any cross validation. This is done to establish the models first, and fine tune the paramters (for example, the number of trees required for model stability and such). This is done with three models in mind:

Model 1. Mood Model 2. Physiology Model 3. Combination

Model 1 classifies week from the EMA mood outcomes, while Model 2 does the same using the EPA output. We then finally test these models using the combination thereof in Model 3. After we check these models, we can then go ahead and run the models with cross validation in the next sections.Based on the OOB, we see that the combined model does the best, while the physiology model does the worst.

Model 1: Mood

This model classifies week type from the affect items

# Run random forest model for mood vars
forest.mood <- randomForest(Week_Type ~ mood_positive + mood_negative,
                            data=df.RandomForest, 
                            ntree=5000,
                          importance = TRUE)
forest.mood

Call:
 randomForest(formula = Week_Type ~ mood_positive + mood_negative,      data = df.RandomForest, ntree = 5000, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 5000
No. of variables tried at each split: 1

        OOB estimate of  error rate: 43.6%
Confusion matrix:
        Control Stress class.error
Control    1305    783   0.3750000
Stress     1052   1069   0.4959925

Model 2: Physio

Now we can check what the physio data looks like.

# Run random forest full model
vars.forest.physio <- c( "sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "acc_delta", "temp_mean")
forest.full <- randomForest( as.formula(paste("Week_Type", "~", (paste(vars.forest.physio, collapse="+")))) ,
                            data=df.RandomForest, 
                            ntree=5000,
                            importance = TRUE)
forest.full

Call:
 randomForest(formula = as.formula(paste("Week_Type", "~", (paste(vars.forest.physio,      collapse = "+")))), data = df.RandomForest, ntree = 5000,      importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 5000
No. of variables tried at each split: 3

        OOB estimate of  error rate: 46.78%
Confusion matrix:
        Control Stress class.error
Control    1074   1014   0.4856322
Stress      955   1166   0.4502593
randomForest::importance(forest.full)
                  Control     Stress MeanDecreaseAccuracy MeanDecreaseGini
sc_tonic_mean  -5.4542677   9.163026             3.397136        219.90087
sc_phasic_mag -11.9696089  19.331792             7.575112        164.73550
sc_phasic_dur  24.2393172 -16.158558            13.334569         98.64556
sc_phasic_auc  -3.5057628  13.075322            13.396162        213.54617
sc_phasic_num   4.2622800   6.046314            14.319480        115.88013
hr_mean        -0.5555198   3.298592             2.988422        208.32216
hr_max         -4.9763594  13.851207             9.833186        212.45443
hr_min        -20.8453025  26.216330             5.995893        207.15003
hr_sd          -3.4171533   6.011027             2.646818        207.98500
acc_delta      22.3870443 -14.067083             7.159434        226.28434
temp_mean      -0.8913402  15.224456            10.293676        226.91135

Model 3: Combined

Next up we check the entire data set and see if using both is good.

# Run the forest with most important features
forest.important <- randomForest(Week_Type ~ .,
                            data=df.RandomForest, 
                            ntree=5000,
                            importance = TRUE)
forest.important

Call:
 randomForest(formula = Week_Type ~ ., data = df.RandomForest,      ntree = 5000, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 5000
No. of variables tried at each split: 3

        OOB estimate of  error rate: 41.91%
Confusion matrix:
        Control Stress class.error
Control    1179    909   0.4353448
Stress      855   1266   0.4031117

5.2 LOBO

In order to perform the validation, we try out a leave-one-beep-out (LOBO) analysis. This analysis will run a random forest model for each subject separately, leaving out one survey when running the model. We then test the model on the beep that was left out. We repeat this process for the subject until we’ve removed each survey/beep out once. This results in a series of predictions that give us an error level for each subject. In order to do this, we have developed a function that is provided in this github directory mentioned in the introducton. This will produce the classification errors for each subject.

We also need to test all our models against the true chance levels. One can assume in theory that the prediction error for a dichotomous variable is 50/50, but we dont like to do things the easy way. Instead, we will do 10000 iterations where we bootstrap resample the stress and control weeks. This will give us the real error rate with a sampling distribution. This was made into a function, but for some reason I couldnt get the function to run in parallel processing on our unix system. So instead I run the parallel processing of the bootstrap outside of a function. Its not pretty, but it works.

We also test the LOBO model using against the bootstrapped LOBO model. We also made a function to do this. The function estimates the p-value by comparing it to the permuation test distribution. The function also has the option to estimate the p-value from an assumed normal distribution, but we simply use the actual distribution for this. We additionally compute a combined p-value with this function using Stoufferś method and the poolr package.

This results in the three tabs for each model:

  1. Model: Contains the actual results of the LOBO model
  2. Bootstrap: Contains the bootstrap error estimation results
  3. Stouffer’s tests: Contains the tests against the null distribution and the pooled p-values

5.2.1 Model 1: Mood

Some parts of the code are commented to make producing the notebook easier, we see that the mean LOBO error rate is 33.45 percent, and that the model performs relatively well on most subjects. Based on the estimated bootstrap error distribution of around 50%, we also show that this model performs above chance.

Model

# Then with the full model
vars.forest.mood <-  c("mood_positive_c", "mood_negative_c")
# forest.lobo.mood <- rf.lobo(Data=EMA_Data,
#                               SubNr="castor_record_id",
#                            xvars=vars.forest.mood,
#                               yvar="Week_Type",
#                               NoTree=5000)
as.data.frame(forest.lobo.mood$total$subject_errors)
psych::describe(forest.lobo.mood$total$subject_errors)

Bootstrap

# BootstrapLOBO.
# { cl <- makeCluster(NoCores-1)
# registerDoSNOW(cl)
# iterations <- 10000
# print("Running, this will take a while...", quote=F)
# pb <- txtProgressBar(max = iterations, style = 3)
# progress <- function(n) setTxtProgressBar(pb, n)
# opts <- list(progress = progress)
# forest.boot.mood <- foreach(i=1:iterations, .options.snow = opts ) %dopar% {
#     rf.BootstrapError(Data=EMA_Data,
#                           Shuffle="Week_Type",
#                           Iterations=1,
#                           SubjectId="castor_record_id",
#                           xvar=vars.forest.mood,
#                           yvar="Week_Type",
#                           Trees=500)
# }
# print("Done!", quote=F)
# stopCluster(cl)
# # Now merge them into one dataframe
# pb <- txtProgressBar(max =length(forest.boot.mood), style = 3)
# forest.boot.mood.merge <- as.data.frame(forest.boot.mood[[1]][2])
# for (i in 2:length(forest.boot.mood)) {
#     setTxtProgressBar(pb, i)
#     df.2merge <- as.data.frame(forest.boot.mood[[i]][2])
#     forest.boot.mood.merge <- merge (df.2merge, forest.boot.mood.merge , by="DataFrame.id")
# }
# # After merging the results into a single data frame, lets also everage the error rate
# forest.boot.mood.merge$averageError <- rowMeans(forest.boot.mood.merge [, -which(names( forest.boot.mood.merge) %in% c("DataFrame.id"))], na.rm=T)
# saveRDS(forest.boot.mood.merge, file = "data/bootstrap_mood.rds")
# }

Now that we have run the bootstrap, we also save it just in case, and then we get the average error, and calcualte the true SD and SE from the sampling distribution.

# Print the Errors
boot.mood.descr <- psych::describe(forest.boot.mood.merge$averageError)
# Also get the true SD of bootstraps
boot.mood.descr$sd <- mean((psych::describe(forest.boot.mood.merge))$sd, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.mood.descr$se <- mean((psych::describe(forest.boot.mood.merge))$se, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.mood.descr

Stouffer’s Test

lobo.mood_null <- rf.null_test(forest.lobo.mood, forest.boot.mood.merge, model_type="LOBO", method="actual")
lobo.mood_null
$p_val
 [1] 0.1597 0.0197 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[20] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[39] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[58] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[77] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000     NA

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 82 
test statistic:              33.193 ~ N(0,1) 
adjustment:                  none 
combined p-value:            <2e-16 

5.2.2 Model 2: Physiology

The second model I will test is whether we can predict week type from the physiology data alone. For this model, the LOBO error rate is 36.11, which is still better than chance level predictions, but worse than model 1.

Model

# Then with the full model
# vars.forest.physio <-  c("sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "acc_delta", "temp_mean")
# forest.lobo.physio <- rf.lobo(Data=EMA_Data,
#                               SubNr="castor_record_id",
#                               xvars=vars.forest.physio,
#                               yvar="Week_Type",
#                               NoTree=5000)
as.data.frame(forest.lobo.physio$total$subject_errors)
psych::describe(forest.lobo.physio$total$subject_errors)

Bootstrap

We again do the bootstrap model, and then save it as an object for later use.

# # LOBO Bootstrapping
# { cl <- makeCluster(NoCores-1)
#     registerDoSNOW(cl)
#     iterations <- 10000
#     print("Running, this will take a while...", quote=F)
#     pb <- txtProgressBar(max = iterations, style = 3)
#     progress <- function(n) setTxtProgressBar(pb, n)
#     opts <- list(progress = progress)
#     forest.boot.physio <- foreach(i=1:iterations, .options.snow = opts ) %dopar% {
#         rf.BootstrapError(Data=EMA_Data,
#                                           Shuffle="Week_Type",
#                                           Iterations=1,
#                                           SubjectId="castor_record_id",
#                                           xvar=vars.forest.physio,
#                                           yvar="Week_Type",
#                                           Trees=500)
#     }
#     print("Done!", quote=F)
#     stopCluster(cl)
#     
#     # Now merge them into one dataframe
#     pb <- txtProgressBar(max =length(forest.boot.physio), style = 3)
#     forest.boot.physio.merge <- as.data.frame(forest.boot.physio[[1]][2])
#     for (i in 2:length(forest.boot.physio)) {
#         setTxtProgressBar(pb, i)
#         df.2merge <- as.data.frame(forest.boot.physio[[i]][2])
#         forest.boot.physio.merge <- merge(df.2merge, forest.boot.physio.merge , by="DataFrame.id",
#                                           suffixes=c((paste(i,".x")),(paste(i,".y"))))
#     }
#     # Merge it to mean
#     forest.boot.physio.merge$averageError <- rowMeans(forest.boot.physio.merge [, -which(names( forest.boot.physio.merge) %in% c("DataFrame.id"))], na.rm=T)
#     saveRDS( forest.boot.physio.merge, file = "data/bootstrap_physio.rds")
# }

We now calculate the bootstrap SE and SD

# Print the Errors
boot.physio.descr <- psych::describe(forest.boot.physio.merge$averageError)
# Also get the true SD of bootstraps
boot.physio.descr$sd <- mean((psych::describe(forest.boot.physio.merge))$sd, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.physio.descr$se <- mean((psych::describe(forest.boot.physio.merge))$se, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.physio.descr

Stouffer’s Test

So now that I have the averaged bootstrap error for the physio model, lets check if the LOBO is more than random with a test against the bootstrap estimates.

lobo.physio_null <- rf.null_test(forest.lobo.physio, forest.boot.physio.merge,  model_type="LOBO", method="actual")
lobo.physio_null
$p_val
 [1] 0.5632 0.0333 0.0001 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[20] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[39] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[58] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[77] 0.0000 0.0000 0.0000 0.0000

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 80 
test statistic:              32.62 ~ N(0,1) 
adjustment:                  none 
combined p-value:            <2e-16 

According to the t-test against the bootstrap error sample, the test is above chance level here too. I will again do a model comparison at the end of the model-testing sections.

5.2.3 Model 3: Combined

Finally we check the full model using both physio and mood variables. This model perfroms better than the mood model. It also perfroms better than chance for each subject, with the pooled effect being significant.

Model

# Then with the full model
# vars.forest.x <-  c("mood_positive_c", "mood_negative_c", "sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "temp_mean")
# forest.lobo.full <- rf.lobo(Data=EMA_Data,
#                               SubNr="castor_record_id",
#                               xvars=vars.forest.x,
#                               yvar="Week_Type",
#                               NoTree=5000)
as.data.frame(forest.lobo.full$total$subject_errors)
psych::describe(forest.lobo.full$total$subject_errors)

Bootstrap

Then I can check the bootstrap error for the model combined model as done before:

# {cl <- makeCluster(NoCores-1)
# registerDoSNOW(cl)
# iterations <- 10000
# print("Running, this will take a while...", quote=F)
# pb <- txtProgressBar(max = iterations, style = 3)
# progress <- function(n) setTxtProgressBar(pb, n)
# opts <- list(progress = progress)
# forest.boot.combi <- foreach(i=1:iterations, .options.snow = opts ) %dopar% {
#     rf.BootstrapError(Data=EMA_Data,
#                                       Shuffle="Week_Type",
#                                       Iterations=1,
#                                       SubjectId="castor_record_id",
#                                       xvar=vars.forest.x,
#                                       yvar="Week_Type",
#                                       Trees=500)
# }
# print("Done!", quote=F)
# stopCluster(cl)
# 
# # Now merge them into one dataframe
# pb <- txtProgressBar(max =length(forest.boot.combi), style = 3)
# forest.boot.combi.merge <- as.data.frame(forest.boot.physio[[1]][2])
# for (i in 2:length(forest.boot.combi)) {
#     setTxtProgressBar(pb, i)
#     df.2merge <- as.data.frame(forest.boot.combi[[i]][2])
#     forest.boot.combi.merge <- merge(df.2merge, forest.boot.combi.merge , by="DataFrame.id",
#                                       suffixes=c((paste(i,".x")),(paste(i,".y"))))
# }
# # Merge it to mean
# forest.boot.combi.merge$averageError <- rowMeans(forest.boot.combi.merge [, -which(names( forest.boot.combi.merge) %in% c("DataFrame.id"))], na.rm=T)
#  saveRDS( forest.boot.combi.merge, file = "data/bootstrap_combi.rds")
# }

We then again calculate the SE and SD of the models

# Print the Errors
boot.combi.descr <- psych::describe(forest.boot.combi.merge$averageError)
# Also get the true SD of bootstraps
boot.combi.descr$sd <- mean((psych::describe(forest.boot.combi.merge))$sd, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.combi.descr$se <- mean((psych::describe(forest.boot.combi.merge))$se, na.rm=T)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf
boot.combi.descr

Stouffer’s Test

And finally I can test the difference between the full model and the bootstrapped one. So we can see again, that our model only improves slightly with the addition of the physio variables (1%). That doesnt seem great. But we can also guess that within the control week there may be times when people are stressed, and vice versa for the stress week.We will do the null test again.

lobo.combi_null <- rf.null_test(forest.lobo.full, forest.boot.combi.merge, model_type="LOBO", method="actual")
lobo.combi_null
$p_val
 [1] 0.1731 0.0037 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[20] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[39] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[58] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
[77] 0.0000 0.0000 0.0000 0.0000

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 80 
test statistic:              32.837 ~ N(0,1) 
adjustment:                  none 
combined p-value:            <2e-16 

5.2.4 Whats the best LOBO?

We now test the LOBO models against each other. We start with the highest error rates, and that is the mood and physiology models (models 1 and 2). We then test the mood against the combined LOBO model, Based on these results, we see that Model 3 > Model 1 > Model 2.

Mood vs Physio

We filter the data and have to do a couple of manipulations to do a paired t-test.We see that the mood does significantly better

rf.result.df1 <- as.data.frame(forest.lobo.physio$total$subject_errors)
colnames(rf.result.df1)[1] <- "physio"
rf.result.df1$id <- rownames(rf.result.df1)
rf.result.df2 <- as.data.frame(forest.lobo.mood$total$subject_errors)
colnames(rf.result.df2)[1] <- "mood"
rf.result.df2$id <- rownames(rf.result.df2)
rf.result.merge <- merge(rf.result.df1, rf.result.df2, by="id")
tidy(t.test(x=rf.result.merge$physio, y=rf.result.merge$mood, paired=T))

Combi vs Mood

Now I test the mood vs full model. It appears that the full model does a lot better than the one with mood only. So it is safe to say that Model 3 > Model 1 > Model 2

rf.result.df1 <- as.data.frame(forest.lobo.full$total$subject_errors)
colnames(rf.result.df1)[1] <- "full"
rf.result.df1$id <- rownames(rf.result.df1)
rf.result.df2 <- as.data.frame(forest.lobo.mood$total$subject_errors)
colnames(rf.result.df2)[1] <- "mood"
rf.result.df2$id <- rownames(rf.result.df2)
rf.result.merge <- merge(rf.result.df1, rf.result.df2, by="id")
tidy(t.test(x=rf.result.merge$full, y=rf.result.merge$mood, paired=T))

5.3 LOSO

In order to determine whether the models can be generalized beyond the individial, we use a standard Leave-One-Subject-Out approach. In this analysis, we remove an entire subjects data set from the training set. We train our models on the remaining data, and then test the classification errors on the subject that was left out. This process is repeated until every subject has been removed once, thus providing error rates for each subject. For each model, we present the estimated LOSO error rates, and the test against the previously estimated null distribution.

5.3.1 Model 1: Mood

Model

Our first model looks at the mood ratings predicting which week participants are in. I estimate the LOSO error rates below. The model here doesnt do as well as the model with the lobo. Lets try to use the LOBO null distribution to see if its above chance levels next.

# First with mood items
# vars.forest.mood <-  c("mood_positive", "mood_negative")
# forest.loso.mood <- rf.loso(Data=EMA_Data, 
#                        SubNr="castor_record_id", 
#                        xvars=vars.forest.mood,
#                        yvar="Week_Type",
#                        NoTree=5000)
as.data.frame(forest.loso.mood$error_rate)
psych::describe(forest.loso.mood$error_rate*100, na.rm=T)

Test

Here I will try to check the LOSO model vs. the null distribution estimated from the bootstrap we did earler. The loso model did not perform better than the bootstrapped estimates.

forest.loso_mood_null <- rf.null_test(forest.loso.mood, forest.boot.mood.merge,  model_type="LOSO", method="actual")
forest.loso_mood_null
$p_val
 [1] 0.3563 0.5799 0.0000 0.7926 0.0000 0.0000 0.0000 0.0000 0.3076 0.8950 0.0012 0.0076 0.8176 0.5599 1.0000 0.0000 0.0177 0.0225 0.0833
[20] 0.0000 1.0000 0.0000 1.0000 0.0000 0.8348 0.7252 1.0000 0.0000 0.9897 0.0000 0.0004 0.0000 0.0000 0.1273 0.0001 0.9952 0.9466 0.0113
[39] 0.0000 0.9514 0.2565 0.0000 0.0000 0.0000 0.9906 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000 0.0022 0.0000 0.6286
[58] 0.9995 0.0000 1.0000 0.9948 0.0000 0.0020 1.0000 0.0001 1.0000 0.0016 0.2036 0.0000 0.0000 1.0000 0.9998 0.6477 1.0000 1.0000 0.0015
[77] 1.0000 0.0643 0.0000 0.0282 0.0006 0.0000 1.0000

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 83 
test statistic:              -Inf ~ N(0,1) 
adjustment:                  none 
combined p-value:            1 

5.3.2 Model 2: Physiology

The second model is looking at the physio variables predicting week type. We see that it only achieves 47.83% success. We will test this now against the bootstrapped error rate. #### Model{-}

# Then with the full model
# vars.forest.physio <-  c("sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "acc_delta", "temp_mean")
# forest.loso.physio <- rf.loso(Data=EMA_Data, 
#                        SubNr="castor_record_id", 
#                        xvars=vars.forest.physio,
#                        yvar="Week_Type",
#                        NoTree=5000)
as.data.frame(forest.loso.physio$error_rate)
psych::describe(forest.loso.physio$error_rate*100)

Test

Next we check the physio variables against the null distribution. Here we see that it its also not signficantly better than chance.

forest.loso_physio_null <- rf.null_test(forest.loso.physio, forest.boot.physio.merge, model_type="LOSO", method="actual")
forest.loso_physio_null
$p_val
 [1] 0.4703 0.8593 0.2199 0.4417 0.8771 0.0782 0.9687 0.4285 0.0932     NA 0.0021 0.1961 0.0539 0.7650 0.2076 0.0000 0.0000 1.0000 0.0000
[20] 0.9629 1.0000 0.0000 0.0000 0.0305 0.0000 0.2412 1.0000 0.3724 0.9777 0.0000 0.0090 1.0000 0.5665 0.0000 0.0073 0.9108 0.5631 0.9988
[39] 0.9466 0.0000 0.0006 0.1017 0.0000 0.9665 0.5722 0.3070 0.0000 1.0000 0.0000 0.0000 1.0000 0.0001 1.0000 0.9998 0.0000 0.1559 0.1032
[58] 1.0000 0.0233 1.0000 1.0000 0.0017 0.9999 0.5887 1.0000 1.0000 0.0244 0.0000 0.0000 0.9664 0.0005 0.0000 0.0166 1.0000 0.0106 1.0000
[77] 0.0000 0.9998 1.0000 0.9994

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 79 
test statistic:              -Inf ~ N(0,1) 
adjustment:                  none 
combined p-value:            1 

5.3.3 Model 3: Combined

FInally, the third model looks at everything (i.e. both physio and mood). This has an error rate of 43% which still sucks. Lets test this next against the bootstrap error

Model

# Then with the full model
# vars.forest.x <-  c("mood_positive_c", "mood_negative_c",  "sc_tonic_mean", "sc_phasic_mag", "sc_phasic_dur", "sc_phasic_auc", "sc_phasic_num","hr_mean", "hr_max", "hr_min", "hr_sd", "acc_delta", "temp_mean")
# forest.loso.full <- rf.loso(Data=EMA_Data, 
#                        SubNr="castor_record_id", 
#                        xvars=vars.forest.x,
#                        yvar="Week_Type",
#                        NoTree=5000)
as.data.frame(forest.loso.full$error_rate)
psych::describe(forest.loso.full$error_rate*100)

Test

Finally we test the model with both against the null distribution.This one is also not significantly better than chance.

forest.loso_full_null <- rf.null_test(forest.loso.full, forest.boot.combi.merge, model_type="LOSO", method="actual")
forest.loso_full_null
$p_val
 [1] 0.0496 0.2528 0.0000 0.0485 0.0641 0.7740 0.0409 0.0000 0.0001     NA 0.0545 0.6610 0.6780 0.0003 1.0000 0.0000 0.0000 0.5450 0.5457
[20] 0.9957 0.0000 0.0000 0.0000 0.0000 0.0000 0.5653 0.8627 0.3768 0.0000 0.0000 0.0000 1.0000 0.0000 0.1334 0.0000 0.0000 0.0000 0.2496
[39] 0.0000 0.0000 0.0000 0.0000 0.0000 0.0062 0.0000 0.0000 0.0000 0.8257 0.0000 0.0000 0.3471 0.0000 0.0009 0.9658 0.0000 0.0002 0.0000
[58] 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 0.0002 0.0000 1.0000 0.0001 0.0001 0.0000 0.0000 0.0000 0.0629 0.0199 0.0000 1.0000 0.0155
[77] 0.0081 0.0000 0.6212 0.0078

$combined
combined p-values with:      Stouffer's method
number of p-values combined: 79 
test statistic:              -Inf ~ N(0,1) 
adjustment:                  none 
combined p-value:            1 

Based on all three tests for the models against the null we can conclude that the LOSO models do not in fact perform better than chance.

Whats the best LOSO?

Based on the error rate, lets see if one model does a better job than the other:

rf.loso.mood <- as.data.frame(forest.loso.mood$error_rate)
rf.loso.mood$id <- rownames(rf.loso.mood)
rf.loso.physio <- as.data.frame(forest.loso.physio$error_rate)
rf.loso.physio$id <- rownames(rf.loso.physio)
rf.loso.full <- as.data.frame(forest.loso.full$error_rate)
rf.loso.full$id <- rownames(rf.loso.full)
rf.result.merge <- merge(rf.loso.mood, rf.loso.physio, by="id")
rf.result.merge <- merge(rf.result.merge, rf.loso.full, by="id")
tidy(t.test(x=rf.result.merge$`forest.loso.mood$error_rate`, y=rf.result.merge$`forest.loso.physio$error_rate`, paired=T))
tidy(t.test(x=rf.result.merge$`forest.loso.mood$error_rate`, y=rf.result.merge$`forest.loso.full$error_rate`, paired=T))
tidy(t.test(x=rf.result.merge$`forest.loso.physio$error_rate`, y=rf.result.merge$`forest.loso.full$error_rate`, paired=T))

It looks like there is no significant difference between the error rates in the paired sample t-test in these three models. What could this mean? That regardless of what model we use at a population level, we still are not able to make decent predictions. I think that these models arent good at population level predictions, and this is pretty obnvious if we look at the within-subject variance from our linear models. Most of the variance comes from between subjects. Another approach is warranted.

5.4 Plot of Models

We next waht to make a plot of my models with the standard error. We first merge them into one dataframe, then we can actually plot them.

# I will rename the bootstrap coloumns so I can add them to the full model dataframe for plotting
df_boot1 <- forest.boot.mood.merge[,c("DataFrame.id" ,"averageError")]
df_boot1 <- df_boot1 %>% dplyr::rename(id=DataFrame.id, error=averageError) 
df_boot1 <- tibble::add_column(df_boot1, model="boot.mood", .after="id")
df_boot2 <- forest.boot.physio.merge %>% dplyr::select(DataFrame.id, averageError) %>% dplyr::rename(id=DataFrame.id, error=averageError) 
df_boot2 <- tibble::add_column(df_boot2, model="boot.physio", .after="id")
df_boot3 <- forest.boot.combi.merge %>% dplyr::select(DataFrame.id, averageError) %>% dplyr::rename(id=DataFrame.id, error=averageError) 
df_boot3 <- tibble::add_column(df_boot3, model="boot.full", .after="id")
# Join the boot straps
df_boot <- full_join(df_boot1, df_boot2) 
Joining, by = c("id", "model", "error")
df_boot <- full_join(df_boot, df_boot3)
Joining, by = c("id", "model", "error")
# Make the results and merge boot
df_loo <- gather(rf.combined.errors,model, error, loso.mood:lobo.full, factor_key=TRUE)
df_loo <- full_join(df_loo, df_boot)
Joining, by = c("id", "model", "error")
Column `model` joining factor and character vector, coercing into character vector
# Separate coloumns for plotting
df_loo <- separate(df_loo, model, into=c("Method", "Model"))
df_loo_sum <- data_summary(df_loo, "error", c("Method", "Model"))
# Set the SD and SE of bootstrap models to the correct ones of whole model
df_loo_sum$sd[df_loo_sum$Method=="boot" & df_loo_sum$Model=="mood"] <- boot.mood.descr$sd
df_loo_sum$se[df_loo_sum$Method=="boot" & df_loo_sum$Model=="mood"] <- boot.mood.descr$se
df_loo_sum$sd[df_loo_sum$Method=="boot" & df_loo_sum$Model=="physio"] <- boot.physio.descr$sd
df_loo_sum$se[df_loo_sum$Method=="boot" & df_loo_sum$Model=="physio"] <- boot.physio.descr$se
df_loo_sum$sd[df_loo_sum$Method=="boot" & df_loo_sum$Model=="full"] <- boot.combi.descr$sd
df_loo_sum$se[df_loo_sum$Method=="boot" & df_loo_sum$Model=="full"] <- boot.combi.descr$se
# Set the factor to make it pretty
df_loo_sum$Method <- factor(df_loo_sum$Method, levels =c("lobo", "loso", "boot"), labels = c("LOBO", "LOSO", "Bootstrap"))
df_loo_sum$Model<- factor(df_loo_sum$Model, levels =c("mood", "physio", "full"), labels = c("Model 1:\nMood", "Model 2:\n Physiology", "Model 3:\nCombination"))
figure.loo <- ggplot(df_loo_sum, aes(x=Model, y=error, colour=Method, fill=Method)) +
    geom_bar(stat="summary", position = position_dodge2()) + 
    geom_errorbar(aes(ymin=error-se, ymax=error+se), width=.2, position=position_dodge(.9), colour="black")  + 
    scale_y_continuous(breaks=c(0,10,20,30,40,50, 60, 70, 80), minor_breaks=c(5,15,25,35,45,55,65,75, 85) )+ 
    scale_colour_brewer(palette="Set2") + scale_fill_brewer(palette="Set2") + 
    xlab("")+ ylab("Error Rate (%)\n") + 
    theme(text=element_text(size=16,  family="Calibri"), 
          axis.line = element_line(size = 1, colour = "grey"),
          panel.background = element_rect(fill="transparent"),
        panel.grid.minor.y = element_line(colour="grey95"),
        panel.grid.major.y = element_line(colour = "grey95")); 
ggsave("figures/fig_RFModels.tiff", units="in", width=4, height=4, dpi=300, compression = 'lzw')
figure.loo

5.5 Testing All Models

Now we want to see for each of the models, which one performs best. I first need to split the long dataframe I made for the figures into a wide format.

df_loo_wide <- pivot_wider(df_loo,id_cols = id, names_from=c(Method, Model), values_from=error)
print(df_loo_wide)
#write_csv(df_loo_wide, file = "data/LOO_DF.csv")

5.5.1 Model 1: Mood

LOBO vs Boot

tidy(t.test(df_loo_wide$lobo_mood, df_loo_wide$boot_mood , paired = T))

LOSO vs Boot

tidy(t.test(df_loo_wide$loso_mood, df_loo_wide$boot_mood , paired = T))

LOBO vs LOSO

tidy(t.test(df_loo_wide$lobo_mood, df_loo_wide$loso_mood , paired = T))

5.5.2 Model 2: Physio

LOBO vs Boot

tidy(t.test(df_loo_wide$lobo_physio, df_loo_wide$boot_physio , paired = T))

LOSO vs Boot

tidy(t.test(df_loo_wide$loso_physio, df_loo_wide$boot_physio , paired = T))

LOBO vs LOSO

tidy(t.test(df_loo_wide$lobo_physio, df_loo_wide$loso_physio , paired = T))

5.5.3 Model 3: Full Model

LOBO vs Boot

tidy(t.test(df_loo_wide$lobo_full, df_loo_wide$boot_full , paired = T))

LOSO vs Boot

tidy(t.test(df_loo_wide$loso_full, df_loo_wide$boot_full , paired = T))

LOBO vs LOSO

tidy(t.test(df_loo_wide$lobo_full, df_loo_wide$loso_full , paired = T))

6 System Info

sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-conda_cos6-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)

Matrix products: default
BLAS/LAPACK: /home/cogaff/raytut/.conda/envs/r_env/lib/R/lib/libRblas.so

locale:
[1] en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] poolr_0.8-2         mediation_4.5.0     mvtnorm_1.1-1       extrafont_0.17      stargazer_5.2.2     factoextra_1.0.7   
 [7] knitr_1.32          ggpubr_0.4.0        qgraph_1.6.5        randomForest_4.6-14 doSNOW_1.0.18       snow_0.4-3         
[13] iterators_1.0.12    foreach_1.5.0       future_1.18.0       performance_0.6.1   gamm4_0.2-6         mgcv_1.8-31        
[19] nlme_3.1-147        r2glmm_0.1.2        effectsize_0.3.1    sjPlot_2.8.7        jtools_2.1.0        olsrr_0.5.3        
[25] optimx_2020-4.2     ppcor_1.1           MASS_7.3-51.6       corrr_0.4.2         RcmdrMisc_2.7-0     sandwich_2.5-1     
[31] car_3.0-8           carData_3.0-4       Hmisc_4.4-0         Formula_1.2-3       survival_3.2-3      lattice_0.20-41    
[37] psycho_0.5.0        psych_1.9.12.31     boot_1.3-25         esmpack_0.1-14      remotes_2.1.1       scales_1.1.1       
[43] zoo_1.8-8           data.table_1.12.8   janitor_2.0.1       hablar_0.3.0        broom_0.5.6         plyr_1.8.6         
[49] forcats_0.5.0       stringr_1.4.0       dplyr_0.8.5         purrr_0.3.4         readr_1.3.1         tidyr_1.0.2        
[55] tibble_3.0.1        ggplot2_3.3.3       tidyverse_1.3.0     readxl_1.3.1        lmerTest_3.1-2      lme4_1.1-23        
[61] Matrix_1.2-18      

loaded via a namespace (and not attached):
  [1] proto_1.0.0             tidyselect_1.0.0        htmlwidgets_1.5.1       grid_3.6.1              lpSolve_5.6.15         
  [6] munsell_0.5.0           codetools_0.2-16        statmod_1.4.34          withr_2.4.2             colorspace_2.0-0       
 [11] rstudioapi_0.11         stats4_3.6.1            ggsignif_0.6.0          Rttf2pt1_1.3.8          listenv_0.8.0          
 [16] labeling_0.4.2          huge_1.3.4.1            emmeans_1.5.1           mnormt_1.5-6            farver_2.1.0           
 [21] coda_0.19-3             vctrs_0.3.1             generics_0.0.2          TH.data_1.0-10          clusterGeneration_1.3.4
 [26] xfun_0.22               R6_2.5.0                arm_1.11-1              graphicalVAR_0.2.3      assertthat_0.2.1       
 [31] multcomp_1.4-13         nnet_7.3-14             texreg_1.37.5           gtable_0.3.0            globals_0.12.5         
 [36] goftest_1.2-2           rlang_0.4.5             splines_3.6.1           extrafontdb_1.0         rstatix_0.6.0          
 [41] acepack_1.4.1           checkmate_2.0.0         yaml_2.2.1              reshape2_1.4.4          abind_1.4-5            
 [46] modelr_0.1.8            d3Network_0.5.2.1       backports_1.1.6         tools_3.6.1             lavaan_0.6-6           
 [51] ellipsis_0.3.1          RColorBrewer_1.1-2      gsubfn_0.7              Rcpp_1.0.4.6            base64enc_0.1-3        
 [56] rpart_4.1-15            pbapply_1.4-2           cowplot_1.0.0           ggrepel_0.8.2           haven_2.3.1            
 [61] cluster_2.1.0           fs_1.4.2                magrittr_2.0.1          openxlsx_4.1.5          reprex_0.3.0           
 [66] whisker_0.4             sjmisc_2.8.6            hms_0.5.3               xtable_1.8-4            pbkrtest_0.4-8.6       
 [71] rio_0.5.16              sjstats_0.18.1          jpeg_0.1-8.1            gridExtra_2.3           ggeffects_1.0.1        
 [76] shape_1.4.5             compiler_3.6.1          crayon_1.4.1            minqa_1.2.4             htmltools_0.5.0        
 [81] corpcor_1.6.9           lubridate_1.7.9         DBI_1.1.0               sjlabelled_1.1.6        dbplyr_1.4.4           
 [86] cli_2.4.0               parallel_3.6.1          insight_0.13.2          igraph_1.2.5            BDgraph_2.62           
 [91] pkgconfig_2.0.3         numDeriv_2016.8-1.1     foreign_0.8-71          xml2_1.3.2              pbivnorm_0.6.0         
 [96] estimability_1.3        rvest_0.3.5             snakecase_0.11.0        digest_0.6.27           parameters_0.13.0      
[101] cellranger_1.1.0        htmlTable_2.0.1         nortest_1.0-4           curl_4.3                gtools_3.8.2           
[106] rjson_0.2.20            nloptr_1.2.2.2          lifecycle_0.2.0         glasso_1.11             jsonlite_1.7.0         
[111] pillar_1.4.4            mlVAR_0.4.4             httr_1.4.1              glue_1.4.0              bayestestR_0.9.0       
[116] zip_2.0.4               fdrtool_1.2.15          MplusAutomation_0.7-3   png_0.1-7               pander_0.6.3           
[121] glmnet_4.0-2            class_7.3-17            stringi_1.4.6           blob_1.2.1              latticeExtra_0.6-29    
[126] e1071_1.7-3            
LS0tCnRpdGxlOiAiTW9tZW50YXJ5IG1vb2QgYW5kIGFyb3VzYWwgZGV0ZWN0IHJlYWwtbGlmZSBwcm9sb25nZWQgc3RyZXNzIgphdXRob3I6ICJSYXl5YW4gVHV0dW5qaSIKZGF0ZTogIjIxLTA0LTIwMjEiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICAgIGNvbGxhcHNlZDogdHJ1ZSAKICBodG1sX2RvY3VtZW50OgogICAgZmlnX2hlaWdodDogNgogICAgZmlnX3dpZHRoOiA5CiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoKIyBJbnRyb2R1Y3Rpb24KClRoaXMgYW5hbHlzaXMgbm90ZWJvb2sgYWNjb21wYW5pZXMgdGhlIHBhcGVyICoqVXNpbmcgd2VhcmFibGUgYmlvc2Vuc29ycyBhbmQgZWNvbG9naWNhbCBtb21lbnRhcnkgYXNzZXNzbWVudHMgZm9yIHRoZSBkZXRlY3Rpb24gb2YgcHJvbG9uZ2VkIHN0cmVzcyBpbiByZWFsIGxpZmUqKiBieSBUdXR1bmppIGV0IGFsLiAyMDIxLCBhbmQgdXRpbGl6ZXMgZGF0YSBmcm9tIHRoZSBzdHVkeSAiU3RyZXNzIFJlc2xpZW5jZSBhbmQgdGhlIEJyYWluIGluIE1lZGljYWwgU3R1ZGVudHMgKFNUUkFJTi1NRCkiLiBTdHVkeSBkZXNpZ24gZGV0YWlscyBjYW4gYmUgZm91bmVkIGluIHRoZSBbb3JpZ2luYWwgYXJ0aWNsZV0ocGFzdGUgbGluayBhZnRlciBwdWJsaWNhdGlvbiksIGJ1dCBhIGJyaWVmIHN1bW1hcnkgaXMgcHJvdmlkZWQgaGVyZSB0byBhc3Npc3QgaW4gcmVhZGluZyBjb21wcmVoZW5zaW9uLiBJbiB0aGlzIHN0dWR5LCBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHR3byB3ZWVrcyBvZiBFY29sb2dpY2FsIE1vbWVudGFyeSBBc2Vzc21lbnRzIChFTUEvRVNNKSBjb3VwbGVkIHdpdGggRWNvbG9naWNhbCBQaHlzaW9sb2dpY2FsIEFzc2Vzc21lbnRzIChFUEEpLiBPbmUgb2YgdGhlc2Ugd2Vla3MgY3VsbWluYXRlZCBpbiBhIGhpZ2gtc3Rha2VzIGV4YW0sIHdoaWxlIHRoZSBvdGhlciB3YXMgb3V0c2lkZSBvZiBleGFtaW5hdGlvbiBwZXJpb2RzIHRodXMgcHJvdmlkaW5nIGEgc3RyZXNzIGFuZCBjb250cm9sIHdlZWsgcmVzcGVjdGl2ZWx5LiBFTUEgY29uc2lzdGVkIG9mIHF1ZXN0aW9ucyByZWdhcmRpbmcgc3ViamVjdGl2ZSBzdHJlc3MsIGFuZCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgYWZmZWN0LiBFUEEgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoaXMgc3R1ZHkgY29uc2lzdGVkIG9mIGEgW3dlYXJhYmxlIGRldmljZV0oaHR0cHM6Ly93d3cuZW1wYXRpY2EuY29tL3Jlc2VhcmNoL2U0LykgdGhhdCBjb2xsZWN0ZWQgY29udGludW91cyBtZWFzdXJlcyBvZiBwaHlzaW9sb2dpY2FsIGFyb3VzYWwuIFVzaW5nIHRoZXNlIG1lYXN1cmVzLCB3ZSBmaXJzdCB2YWxpZGF0ZSBvdXIgc3RyZXNzIGV4cG9zdXJlIGJ5IGV4YW1pbmluZyBjaGFuZ2VzIGluIHN1YmplY3RpdmUgc3RyZXNzIHJhdGluZ3MgYmV0d2VlbiB0aGUgdHdvIHdlZWsuIFdlIHRoZW4gZGVtb25zdHJhdGUgdGhlIGltcGFjdCBvZiBzdHJlc3MgZXhwb3N1cmUgb24gbW9vZCBhbmQgYXJvdXNhbCBtZWFzdXJlcy4gV2UgdGhlbiBleHBsb3JlIG91ciBmaW5kaW5ncyBieSBsb29raW5nIGF0IGNvbnRpbnVvdXMgYXNzb2NpYXRpb25zIGJldHdlZW4gc3ViamVjdGl2ZSBzdHJlc3MgYW5kIG91dGNvbWVzLiBGaW5hbGx5LCB3ZSBkZW1vbnN0cmF0ZSB0aGUgZmVhc2liaWxpdHkgb2YgTW9vZCBhbmQgRVBBIG1lYXN1cmVzIGluIHByZWRpY3Rpb24gb2Ygc3RyZXNzIGFuZCBjb250cm9sIHdlZWtzIHVzaW5nIG1hY2hpbmUgbGVhcm5pbmcgbW9kZWxzLiAKCkFsbCBjdXN0b20gZnVuY3Rpb25zIGFuZCBjb2RlIGNhbiBiZSBmb3VuZCBpbiBbYXNzb2NpYXRlZCBHaXRIdWIgZGlyZWN0b3J5XShodHRwczovL2dpdGh1Yi5jb20vcmF5dHV0L0RldGVjdGluZ1N0cmVzcy90cmVlL21haW4vY29kZSkuIExpYnJhcmllcyB1c2VkIGxpc3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gSW4gYWRkaXRpb24gdG8gdGhlIGxpYnJhcmllcywgd2UgYWxzbyB1c2VkIHByZXNwZWNpZmllZCB0aGVtZXMgZm9yIGdncGxvdHMgdGhhdCBtYWtlIHNvbWUgcGxvdHMgZWFzaWVyIHRvIGRyYXcuIFRoZXNlIGFyZSBhbGwgcnVuIGluIHRoZSBzZXQtdXAgY2h1bmtzLiAKCmBgYHtyIEltcG9ydCBMaWJyYXJpZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHNldHVwPVRSVUV9CgojIExpYnJhcmllcyB0byBpbXBvcnQgYW5kIGNsZWFuIGRhdGEKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkgKHRpZHl2ZXJzZSkKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5IChoYWJsYXIpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHpvbykKbGlicmFyeShzY2FsZXMpICMgUmVzY2FsaW5nIG1hZGUgZWFzeQoKIyBMaWJyYXJ5IGZvciBFTUEKbGlicmFyeSAocmVtb3RlcykKI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJ3dmllY2h0Yi9lc21wYWNrIikgIyBjb21tZW50ZWQsIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBmcm9tIGdpdGh1YgpsaWJyYXJ5KGVzbXBhY2spCmxpYnJhcnkoYm9vdCkgCgojIEJhc2ljIFN0YXRzCmxpYnJhcnkgKHBzeWNoKQpsaWJyYXJ5IChwc3ljaG8pCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkoUmNtZHJNaXNjKQpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHBwY29yKQoKIyBNaXhlZCBNb2RlbCAKbGlicmFyeSAobG1lclRlc3QpCmxpYnJhcnkob3B0aW14KSAjIE9wdGltaXplciBmb3IgbG0gCmxpYnJhcnkob2xzcnIpICMgRGlhZ25vc3RpYyBmb3IgbG1lcgpsaWJyYXJ5KGp0b29scykgIyBVc2VzIHN1bW0gZnVuY3Rpb24gZm9yIHJlYWRhYmxlIG1vZGVscyB0aGF0IGxvb2sgcHJldHR5CmxpYnJhcnkoc2pQbG90KSAjIG1vcmUgbW9kZWxpbmcgZGlzcGxheQpsaWJyYXJ5KGVmZmVjdHNpemUpICMgR2V0IGVmZmVjdCBzaXplcyBmcm9tIHRzdGF0CmxpYnJhcnkocjJnbG1tKSAjIENvbXB1dGUgZWZmZWN0IHNpemUgZGlyZWN0bHkKbGlicmFyeShnYW1tNCkgIyBBbHRlcm5hdGl2ZSBtb2RlbCBmaXR0aW5nCmxpYnJhcnkocGVyZm9ybWFuY2UpCiAgICAKIyBQYXJhbGxlbCBwcm9jZXNzaW5nCmxpYnJhcnkoZnV0dXJlKQpsaWJyYXJ5KGRvU05PVykKbGlicmFyeShyYW5kb21Gb3Jlc3QpCgojUGxvdHRpbmcKbGlicmFyeShnZ3Bsb3QyKSAjIFN0YW5kYXJkIHBsb3R0aW5nCmxpYnJhcnkocWdyYXBoKSAjIE1MVkFSIE5ldHdvcmsgUGxvdHRpbmcKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoa25pdHIpCgojUENBCmxpYnJhcnkoZmFjdG9leHRyYSkKCiNGb250cyBhbmQgUHJldHR5IHRoaW5ncwpsaWJyYXJ5KHN0YXJnYXplcikKbGlicmFyeShleHRyYWZvbnQpCgojZm9udF9pbXBvcnQoKQpsb2FkZm9udHMoZGV2aWNlPSJwZGYiKQpgYGAKCkluIGFkZGl0aW9uIHRvIHRoZSBsaWJyYXJpZXMsIHdlIGFsc28gdXNlZCBwcmVzcGVjaWZpZWQgdGhlbWVzIGZvciBnZ3Bsb3RzIHRoYXQgbWFrZSBzb21lIHBsb3RzIGVhc2llciB0byBkcmF3LgpgYGB7cn0KIyBUaGVtZSAxCmdndGhlbWUgPC0gdGhlbWUgKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYsICBmYW1pbHk9IkNhbWJyaWEiKSwKICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGhqdXN0PTAuNSksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9saW5lKHNpemU9MyksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImFsaWNlYmx1ZSIpICkKIyBUaGVtZSAyCnB0aGVtZSA8LSB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTExLCAgZmFtaWx5PSJDYWxpYnJpIiksIAogICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKHNpemUgPSAxLCBjb2xvdXIgPSAiZ3JleSIpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvciA9IE5BKSwgIyBiZyBvZiB0aGUgcGxvdAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXI9ImdyZXk5NSIpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTk1IikpIAogIAojIFNldCBudW1iZXIgb2YgY29yZXMKTm9Db3JlcyA8LSBhcy5udW1lcmljKGF2YWlsYWJsZUNvcmVzKCkpLTEKICAKYGBgCgpCZWZvcmUgc3RhcnRpbmcsIHdlIGFsc28gbG9hZCB0aGUgY3VzdG9tIGZ1bmN0aW9ucyBnZW5lcmF0ZWQuCmBgYHtyfQpzb3VyY2UoImZ1bmN0aW9ucy5SIikKYGBgCgojIERhdGEKCldlIGZpcnN0IGxvYWQgaW4gdGhlIGRlc2NyaXB0aXZlIGZpbGUgaGVyZSwgYW5kIHBlcmZyb20gc29tZSBjbGVhbmluZyB0byBtYWtlIHRoZSBmaWxlIG1vcmUgaHVtYW4gZnJpZW5kbHkuIFRoZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgZmlsZSB0aGFuIHRoZSBFTUEgaW5mb3JtYXRpb24gdG8gYXZvaWQgbGlua2luZyB0aGUgYW55IHBvdGVudGlhbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiB0byB0aGUgYWN0dWFsIGRhdGEuIFRoaXMgc2VjdGlvbiBpcyByZWRhY3RlZCBmcm9tIHRoZSBwdWJsaWMgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyByZWFzb24uCgpgYGB7cn0KIyBHZXQgZGVzY3JpdHBpdmUgc3RhdHMKRU1BX2Rlc2NyIDwtIHJlYWQuZGVsaW0oIi4uL2RhdGEvZGVzY3JpcHRpdmVzLnR4dCIpCgojIENsZWFudXAKRU1BX2Rlc2NyJGNhc3Rvcl9yZWNvcmRfaWQgPC0gRU1BX2Rlc2NyJFN1YmplY3RfSUQKRU1BX2Rlc2NyJFNleFtFTUFfZGVzY3IkQ29udHJhY2VwdGl2ZV91c2U9PSJNYWxlIl0gPC0gIk1hbGUiCkVNQV9kZXNjciRTZXhbRU1BX2Rlc2NyJENvbnRyYWNlcHRpdmVfdXNlIT0iTWFsZSJdIDwtICJGZW1hbGUiCiMgUmVjb2RlIHdlZWtzIGFuZCBmaXJzdCBzY2FuIGFzIGZhY3RvcgpFTUFfZGVzY3IkRmlyc3RfV2Vla1tFTUFfZGVzY3IkQ29sdW1uMSA+IDBdIDwtICJFeGFtLUZpcnN0IgpFTUFfZGVzY3IkRmlyc3RfV2Vla1tFTUFfZGVzY3IkQ29sdW1uMSA8IDBdIDwtICJDb250cm9sLUZpcnN0IgoKIyBSZWNvZGUgZmlyc3Qgc2NhbgpFTUFfZGVzY3IkRmlyc3RfU2Nhbl9OdW0gPC0gRU1BX2Rlc2NyJEZpcnN0X1NjYW4KRU1BX2Rlc2NyJEZpcnN0X1NjYW5bRU1BX2Rlc2NyJEZpcnN0X1NjYW5fTnVtIDwgMF0gPC0gIlN0cmVzcy1GaXJzdCIKRU1BX2Rlc2NyJEZpcnN0X1NjYW5bRU1BX2Rlc2NyJEZpcnN0X1NjYW5fTnVtID4gMF0gPC0gIkNvbnRyb2wtRmlyc3QiCgpgYGAKClVzaW5nIHB5dGhvbiwgd2UgZGVyaXZlZCBwaHlzaW9sb2dpY2FsIGZlYXR1cmVzIGluIDEwLW1pbnV0ZSB0aW1lIHdpbmRvd3MgcHJpb3IgdG8gZWFjaCBFTUEgc3VydmV5IGZyb20gdGhlIHJhdyBFUEEgZGF0YSBmb3IgZWFjaCBwYXJ0aWNpcGFudC4gUHJlcHJvY2Vzc2luZyBpcyBkb25lIHRocm91Z2ggcHl0aG9uIHdpdGggdGhlIFtweXBoeXNpbyBwYWNrYWdlXShodHRwczovL2dpdGh1Yi5jb20vTVBCQS9weXBoeXNpbykgd2hpY2ggaGFzIHNvbWUgdG9vbHMgZm9yIHByb2Nlc3NpbmcgYmlvc2lnbmFscy4gRU1BIGRhdGEgaXMgbm90IHByb2Nlc3NlZCBkdXJpbmcgdGhpcyBwaGFzZSBhbmQgdGhlIHJhdyBvdXRwdXQgZnJvbSB0aGUgc3VydmV5cyBpcyBsb2FkZWQgaW50byBSLiBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBFTUEgYW5kIEVQQSBzaWduYWxzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKCi0gRXZlbnQgUmVsYXRlZCBTdHJlc3MKLSBBY3Rpdml0eSBSZWxhdGVkIFN0cmVzcwotIFBoeXNpY2FsIFN0cmVzcwotIFNvY2lhbCBTdHJlc3MKLSBNb29kIChQb3NpdGl2ZSBhbmQgTmVnYXRpdmUpCi0gSGVhcnQgcmF0ZSAoSGlnaC9Mb3cgRnJlcXVlbmNleSwgUk1TU0QsIElCSS4uLikKLSBTa2luIENvbmR1Y3RhbmNlIChQaGFzaWMsIFRvbmljLCBNYWduaXR1ZGUuLi4pCi0gU2tpbiBUZW1wZXJhdHVyZSAoU2xvcGUsIE1lYW4pCi0gQWNjZWxvcm9tZXRlciBEYXRhIChkZWx0YSBBQ0MsIG1lYW4gWCxZLFogZGlyZWN0aW9uKQoKCldlIHRoZW4gbG9hZCB0aGlzIGZpbGUsIGFuZCByZWNvZGUgc29tZSB2YXJpYWJsZXMgYW5kIHBlcmZyb20gc29tZSBzcGVjaWZpYyBjbGVhbmluZyBzdGVwcy4gCmBgYHtyIEVNQSBEYXRhIEltcG9ydH0KCiMgUmVhZCBEYXRhCkVNQV9EYXRhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL0VNQV9DbGVhbl9GZWF0dXJlc18xMG1pbi5jc3YiKSAKCiMgUHJlY2xlYW5pbmcKI0ZpcnN0IGNoYW5nZSB0eXBlcyBpbmNhc2Ugb2YgaW1wcm9wZXIgaW5wdXQKRU1BX0RhdGEgJT4lIHJldHlwZQoKIyBTb21lIHByZWNsZWFuaW5nIGZvciB2YXJpYWJsZSBnZW5lcmF0aW9ucwpFTUFfRGF0YSRvYnMgPC0gYXMubnVtZXJpYyhFTUFfRGF0YSRzdXJ2ZXlfcGFja2FnZV9uYW1lKQpFTUFfRGF0YSA8LSBzZXBhcmF0ZShFTUFfRGF0YSwgJ3N1cnZleV9wYWNrYWdlX25hbWUnLCBjKCdlbWFfZGF5JywnZW1hX2JlZXAnKSwgc2VwID0gLTEsIHJlbW92ZT1GKQpFTUFfRGF0YSRlbWFfYmVlcF9mIDwtIGFzLmZhY3RvcihFTUFfRGF0YSRlbWFfYmVlcCkKRU1BX0RhdGEkZW1hX2JlZXAgPC0gYXMubnVtZXJpYyhFTUFfRGF0YSRlbWFfYmVlcCkKRU1BX0RhdGEkZW1hX2RheSA8LSBhcy5mYWN0b3IoRU1BX0RhdGEkZW1hX2RheSkKRU1BX0RhdGEkZW1hX2RheV9udW0gPC0gYXMubnVtZXJpYyhFTUFfRGF0YSRlbWFfZGF5KQpFTUFfRGF0YSRTdWJfbnJfd2VlayA8LSAgd2l0aChFTUFfRGF0YSwgaW50ZXJhY3Rpb24oY2FzdG9yX3JlY29yZF9pZCwgd2Vla190eXBlKSkKRU1BX0RhdGEkZW1hX3N1cnZleSA8LSBhcy5udW1lcmljKEVNQV9EYXRhJHN1cnZleV9wYWNrYWdlX25hbWUpCgojIE1lcmdlIHdpdGggZGVzY3JpcHRpdmUgYW5kIHJlbW92ZSBkcm9wb3V0cyBmcm9tIGJvdGggZGF0YWZyYW1lcwpFTUFfRGF0YSA8LSBtZXJnZShFTUFfRGF0YSwgRU1BX2Rlc2NyLCBieT0nY2FzdG9yX3JlY29yZF9pZCcpCkVNQV9EYXRhIDwtIGZpbHRlcihFTUFfRGF0YSwgRU1BX0RhdGEkV2F2ZSAhPSAwKQpFTUFfZGVzY3IgPC0gZmlsdGVyKEVNQV9kZXNjciwgRU1BX2Rlc2NyJFdhdmUgIT0gMCkKRU1BX0RhdGEkRmlyc3RfV2VlayA8LSBhcy5mYWN0b3IoRU1BX0RhdGEkRmlyc3RfV2VlaykKIyBLZWVwIG9ubHkgZGlzdGljdApFTUFfRGF0YSA8LSBFTUFfRGF0YSAlPiUgZGlzdGluY3QoU3ViX25yX3dlZWssIG9icywgLmtlZXBfYWxsPVQpCgpFTUFfRGF0YSR3ZWVrX3R5cGUgPC0gRU1BX0RhdGEkd2Vla190eXBlCkVNQV9EYXRhJFdlZWtfVHlwZSA8LSBmYWN0b3IoRU1BX0RhdGEkd2Vla190eXBlLCBsZXZlbHM9YygnMScsJzInKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCdDb250cm9sJywnU3RyZXNzJykpCmBgYAoKCiMjIFNjb3JpbmcgdmFyaWFibGVzCgpCZWZvcmUgYW5hbHl6aW5nIHRoZSBkYXRhLCBzdGlsbCBuZWVkIHRvIGRvIHNvbWUgcHJvY2Vzc2luZyB0byBzdGFuZGFyZGl6ZSB0aGUgdmFyaWFibGVzIHRvIGZpdCB0aGVtIHRvIG1peGVkIG1vZGVscy4gQXMgc3VjaCwgd2UgcHJvY2VzcyB0aGUgcXVlc3Rpb25uYWlyZSBkYXRhIGFuZCB0aGUgRVBBIGRhdGEgYmVsb3cuCgojIyMgRU1BIFZhcmlhYmxlcyB7LnRhYnNldH0KCkZvciBlYWNoIG9mIHRoZSBFTUEgc2NhbGVzLCB3ZSB0cmFuc2Zvcm0gc29tZSBvZiB0aGUgaXRlbXMsIHJlc2NhbGVkIHRoZW0sIGFuZCB0aGVuIHN1bSB0aGVtLiBUaGlzIHZhcnJpZXMgZm9yIGVhY2ggY2F0cm9nb3J5IG9mIHF1ZXNpdG9ucy4gCgojIyMjIFBvc2l0aXZlIEFmZmVjdCB7LX0KUG9zaXRpdmUgYWZmZWN0IGlzIG9uIG9mIG91ciBvdXRjb21lIG1lYXN1cmVzLiBGb3IgcG9zaXRpdmUgYWZmZWN0IChQQSksIHdlIGZpcnN0IHJlc2NhbGUgdGhlIHZhcmlhYmxlcyBmcm9tIC0zIHRvIDMgaW50byAxLTcuIFRoZSBzdW1zIG9mIHRoZSBzY29yZSBpcyBvdmVyYWxsIHJlcG9ydGVkIFBBLiAKYGBge3IgZWNobz1UUlVFfQoKIyMgUG9zaXRpdmU6IFJlc2NhbGUgZnJvbSAtMy0zIHRvIDEgLTcKRU1BX0RhdGEkZW1hX2hhcHB5IDwtIChFTUFfRGF0YSRlbWFfaGFwcHkrNCkKRU1BX0RhdGEkZW1hX3JlbGF4IDwtIChFTUFfRGF0YSRlbWFfcmVsYXgrNCkKRU1BX0RhdGEkZW1hX2NoZWVyIDwtIChFTUFfRGF0YSRlbWFfY2hlZXIrNCkKRU1BX0RhdGEkZW1hX3NhdGlzZmllZCA8LSAoRU1BX0RhdGEkZW1hX3NhdGlzZmllZCs0KQojVG90YWwKRU1BX0RhdGEkbW9vZF9wb3NpdGl2ZSA8LSByb3dTdW1zKEVNQV9EYXRhWyxjKCJlbWFfaGFwcHkiLCJlbWFfcmVsYXgiLCJlbWFfY2hlZXIiLCAiZW1hX3NhdGlzZmllZCIpXSkKCmBgYAoKIyMjIyBOZWdhdGl2ZSBBZmZlY3Qgey19ClNpbWlhbHIgdG8gUEEsIHdlIGRvIHRoZSBzYW1lIGhlcmUgZm9yIG5lZ2F0aXZlIGFmZmVjdC4gV2UgcmVzY2FsZSB0aGUgaW5kaXZpZHVhbCBpdGVtcywgc3VtIGZvciB0b3RhbC4KYGBge3IgZWNobz1UUlVFfQojIyBOZWdhdGl2ZTogUmVzY2FsZQpFTUFfRGF0YSRlbWFfZG93biA8LSAoRU1BX0RhdGEkZW1hX2Rvd24rNCkKRU1BX0RhdGEkZW1hX2d1aWx0eSA8LShFTUFfRGF0YSRlbWFfZ3VpbHR5KzQpCkVNQV9EYXRhJGVtYV9pbnNlY3VyZSA8LSAoRU1BX0RhdGEkZW1hX2luc2VjdXJlKzQpCkVNQV9EYXRhJGVtYV9sb25lbHkgPC0gKEVNQV9EYXRhJGVtYV9sb25lbHkrNCkKRU1BX0RhdGEkZW1hX2FueGlvdXMgPC0gKEVNQV9EYXRhJGVtYV9hbnhpb3VzKzQpCiMgVG90YWw6IFN1bSBvZiBtZWFzdXJlcwpFTUFfRGF0YSRtb29kX25lZ2F0aXZlIDwtIHJvd1N1bXMoRU1BX0RhdGFbLGMoImVtYV9kb3duIiwiZW1hX2d1aWx0eSIsImVtYV9pbnNlY3VyZSIsImVtYV9sb25lbHkiLCJlbWFfYW54aW91cyIpXSkKCmBgYAoKIyMjIyBFdmVudCBTdHJlc3Mgey19CgpFdmVudCByZWxhdGVkIHN0cmVzcyBxdWVzdGlvbnMgcmVsYXRlIHRvIG1vc3QgcHJvbWluZW50IGV2ZW50IHNpbmNlIGxhc3QgYmVlcC4gRm9yIHRoZSBpdGVtcyByYW5raW5nIHRoZSBwbGVhc2FudG5lc3MsIGNvbnRyb2xhYmlsaXR5LCBhbmQgZXhwZWN0ZWRuZXNzLCB3ZSBuZWVkIHRvIHJldmVyc2UgdGhlIHNjb3JlIHNvIHRoYXQgbGVzcyBwb3NpdGl2ZSBldmVudHMgY29udHJpYnV0ZSBtb3JlIHRvIHRoZSB0b3RhbC4gSXQgaXMgYWxzbyBzY2FsZWQgLTMgdG8gMywgd2l0aCBoaWdoZXIgc2NvcmUgYmVpbmcgYmV0dGVyLkkgd2lsbCByZXZlcnNlIHNjYWxlIHRoZSBpdGVtcy4gU28gaWYgYW4gZXZlbnQgaXMgbW9yZSBwbGVhc2FudCwgdGhlIGV2ZW50IHN0cmVzcyBzY29yZSBnb2VzIGRvd24gZm9yIGV4YW1wbGUuIEV2ZW50IGltcG9ydGFuY2UgaXMganVzdCByZXNjYWxlZCB0byAxLTcuCmBgYHtyIGVjaG89VFJVRX0KIyBSZXZlcnNlIHNjYWxlIHRoZSBwbGVhc2FudG5lc3MKIEVNQV9EYXRhJGV2ZW50X3BsZWFzYW50IDwtIChFTUFfRGF0YSRldmVudF9wbGVhc2FudCs0KQpFTUFfRGF0YSRldmVudF9wbGVhc2FudCA8LSAoOC1FTUFfRGF0YSRldmVudF9wbGVhc2FudCkKRU1BX0RhdGEkZXZlbnRfcGxlYXNhbnQgPC0gKEVNQV9EYXRhJGV2ZW50X3BsZWFzYW50LTQpCiMgSW1wb3J0YW5jZSByZXNjYWxlZCAxLTcKRU1BX0RhdGEkZXZlbnRfaW1wb3J0YW5jZSA8LSAoRU1BX0RhdGEkZXZlbnRfaW1wb3J0YW5jZSs0KQojIFJldmVyc2Ugc2NvcmUgQ29udHJvbGFiaWxpdHkKRU1BX0RhdGEkZXZlbnRfY29udHJvbCA8LSAoRU1BX0RhdGEkZXZlbnRfY29udHJvbCs0KQpFTUFfRGF0YSRldmVudF9jb250cm9sIDwtICg4LUVNQV9EYXRhJGV2ZW50X2NvbnRyb2wpCkVNQV9EYXRhJGV2ZW50X2NvbnRyb2wgPC0gKEVNQV9EYXRhJGV2ZW50X2NvbnRyb2wtNCkKIyBSZXZlcnNlIHNjb3JlIEV4cGVjdGVkbmVzcwpFTUFfRGF0YSRldmVudF9leHBlY3Q8LShFTUFfRGF0YSRldmVudF9leHBlY3QrNCkKRU1BX0RhdGEkZXZlbnRfZXhwZWN0PC0oOC1FTUFfRGF0YSRldmVudF9leHBlY3QpCkVNQV9EYXRhJGV2ZW50X2V4cGVjdDwtKEVNQV9EYXRhJGV2ZW50X2V4cGVjdC00KQojIFN1bSBmb3IgVG90YWwKRU1BX0RhdGEkZXZlbnRfdG90IDwtIHJvd1N1bXMoRU1BX0RhdGFbLGMgKCJldmVudF9wbGVhc2FudCIsImV2ZW50X2ltcG9ydGFuY2UiLCJldmVudF9jb250cm9sIiwiZXZlbnRfZXhwZWN0IildKQoKYGBgCgojIyMjIEFjdGl2dGl5IFN0cmVzcyB7LX0KQWN0aXZpdHkgcmVsYXRlZCBzdHJlc3MgcmV0YWlucyB0byB0aGUgYWN0aXZpdHkgcGFydGljaXBhbnRzIGFyZSBjdXJyZW50bHkgZG9pbmcgcmlnaHQgYmVmb3JlIHRoZSBiZWVwLiBUaGUgc2tpbGxlZCBhbmQgcHJlZmVyZW5jZSBtZWFzdXJlIGFyZSBhbHNvIHJldmVyc2VkLiBNb3JlIHNraWxsZWQ9TG93ZXIgc2NvcmUuIFNhbWUgd2l0aCBwcmVmZXJlbmNlLiAKYGBge3IgZWNobz1UUlVFfQojIFJldmVyIFNraWxsZnVsbG5lc3MKRU1BX0RhdGEkYWN0aXZpdHlfc2tpbGw8LShFTUFfRGF0YSRhY3Rpdml0eV9za2lsbCs0KQpFTUFfRGF0YSRhY3Rpdml0eV9za2lsbDwtKDgtRU1BX0RhdGEkYWN0aXZpdHlfc2tpbGwpCkVNQV9EYXRhJGFjdGl2aXR5X3NraWxsPC0oRU1BX0RhdGEkYWN0aXZpdHlfc2tpbGwtNCkgCiMgUmVzY2FsZWQgcHJlZmVyZW5jZSAxLTcKRU1BX0RhdGEkYWN0aXZpdHlfcHJlZmVyZW5jZTwtKEVNQV9EYXRhJGFjdGl2aXR5X3ByZWZlcmVuY2UrNCkKIyBSZXNjYWxlZCBwcmVmZXJlbmNlIDEtNwpFTUFfRGF0YSRhY3Rpdml0eV9lZmZvcnQ8LShFTUFfRGF0YSRhY3Rpdml0eV9lZmZvcnQrNCkKIyBTdW0gZm9yIHRvdGFsCkVNQV9EYXRhJGFjdGl2aXR5X3RvdDwtcm93U3VtcyhFTUFfRGF0YVssYygiYWN0aXZpdHlfc2tpbGwiLCAiYWN0aXZpdHlfcHJlZmVyZW5jZSIsICJhY3Rpdml0eV9lZmZvcnQiKV0pCmBgYAoKIyMjIyBTb2NpYWwgU3RyZXNzIHstfQoKU29jaWFsIHN0cmVzcyBpdGVtcyByZWxhdGUgdG8gdGhlIHNvY2lhbCBzaXR1YXRpb24gcGFydGljaXBhbnRzIGFyZSBpbi4gVGhlcmUgYXJlIHR3byBicmFuY2hlczogRWl0aGVyIHlvdSBhcmUgYWxvbmUsIG9yIHlvdSBhcmUgd2l0aCBzb21lb25lLiBCb3RoIHRoZXNlIGJyYW5jaGVzIHdpbGwgY29udHJpYnV0ZSB0byB0aGUgdG90YWwgc2NvcmUuIFNvbWUgbWVhc3VyZXMgYXJlIHJldmVyZXNlZCwgYW5kIHNvbWUgYXJlIGp1c3QgYnJvdWdodCBpbnRvIHRoZSBwb3NpdGl2ZS4gV2UgYWdhaW4gZ2V0IHRoZSBzdW0gc2NvcmUsIGlnbm9yaW5nIHRoZSBOYU5zIHNpbmNlIHF1ZXN0aW9ucyBhcmUgZGVwZW5kYW50IG9uIGJyYW5jaC4KYGBge3IgZWNobz1UUlVFfQojIFJlc2NhbGUgaWYgdGhleSB3YW50IHRvIGJlIGFsb25lIG9yIHdpdGggc29tZW9uZSAxLTcKRU1BX0RhdGEkc29jaWFsX2Fsb25lPC0oRU1BX0RhdGEkc29jaWFsX2Fsb25lICs0KQpFTUFfRGF0YSRzb2NpYWxfd2l0aCA8LSAoRU1BX0RhdGEkc29jaWFsX3dpdGgrNCkKIyBSZXZlcnNlIHRoZSBwbGVhc2FudG5lc3Mgc2NhbGUKRU1BX0RhdGEkc29jaWFsX3BsZWFzYW50IDwtIChFTUFfRGF0YSRzb2NpYWxfcGxlYXNhbnQgKyA0KQpFTUFfRGF0YSRzb2NpYWxfcGxlYXNhbnQgPC0gKDgtRU1BX0RhdGEkc29jaWFsX3BsZWFzYW50KQojIFJldmVyc2UgdGhlIGF0IGVhc2Ugc2NhbGUKRU1BX0RhdGEkc29jaWFsX2Vhc2U8LSAoRU1BX0RhdGEkc29jaWFsX2Vhc2UgKyA0KQpFTUFfRGF0YSRzb2NpYWxfZWFzZTwtICg4LUVNQV9EYXRhJHNvY2lhbF9lYXNlKQojIFJldmVyc2UgdGhlIHNlbGYgc2NhbGUKRU1BX0RhdGEkc29jaWFsX3NlbGY8LSAoRU1BX0RhdGEkc29jaWFsX3NlbGYgKyA0KQpFTUFfRGF0YSRzb2NpYWxfc2VsZjwtICg4LUVNQV9EYXRhJHNvY2lhbF9zZWxmKQojIFJldmVyc2UgdGhlIGF0IGVhc2UgYWxvbmUgc2NhbGUKRU1BX0RhdGEkc29jaWFsX2Fsb25lX2Vhc2U8LShFTUFfRGF0YSRzb2NpYWxfYWxvbmVfZWFzZSArNCkKRU1BX0RhdGEkc29jaWFsX2Fsb25lX2Vhc2U8LSAoOC1FTUFfRGF0YSRzb2NpYWxfYWxvbmVfZWFzZSkKI1RvdGFsLiBNYWtlIHN1cmUgdGhhdCBuYW5zIGFyZSBub3QgZHJvcHBlZCBiZWNhdXNlIGluIHRoZSBldmVudCB0aGV5IGFyZSBhbG9uZSwgdGhlIHNvY2lhbCBpdGVtcyBhcmUgZGlmZmVyZW50CkVNQV9EYXRhJHNvY2lhbF90b3Q8LXJvd1N1bXMoRU1BX0RhdGFbLGMgKCJzb2NpYWxfYWxvbmUiLCJzb2NpYWxfd2l0aCIsInNvY2lhbF9wbGVhc2FudCIsInNvY2lhbF9lYXNlIiwgInNvY2lhbF9zZWxmIiwgInNvY2lhbF9hbG9uZV9lYXNlIildLCBuYS5ybT1UUlVFKQoKYGBgCgojIyMjIFBoeXNpY2FsIFN0cmVzcyB7LX0KCkl0ZW1zIHJlbGF0ZSB0byBwaHlzaWNhbCBleHBlcmllbmNlcyBvZiBkaXNjb21mb3J0LiBUaGVzZSBhcmUgY29udHJvbCBpdGVtcy4gV2UgZG8gc2ltaWxhciBzdGVwcyBhcyBiZWZvcmUuIFdlIGJyaW5nIHRvIHNjb3JlcyBmcm9tICgtMyA+IDMpIHRvICgxID4gNykgc2NhbGluZywgYW5kIGdldCBhIHN1bSBzY29yZS4gV2UgdGhlbiBqdXN0IGdldCB0aGUgc3VtIHNjb3JlIGZvciB0aGlzLiBJbiB0aGlzIHNlY3Rpb24gd2UgYWxzbyByZXNjYWxlIHRoZSBleGNlcmNpc2UgaXRlbXMgd2hpY2ggd2UgdXNlIGFzIGNvdmFyaWF0ZXMgbGF0ZXIKYGBge3IgZWNobz1UUlVFfQojRmlyc3QgcmVjb2RlCkVNQV9EYXRhJHBoeXNpY2FsX3RpcmVkPC0oNCtFTUFfRGF0YSRwaHlzaWNhbF90aXJlZCkKRU1BX0RhdGEkcGh5c2ljYWxfd2VsbDwtKDQrRU1BX0RhdGEkcGh5c2ljYWxfd2VsbCkKRU1BX0RhdGEkcGh5c2ljYWxfcGFpbjwtICg0K0VNQV9EYXRhJHBoeXNpY2FsX3BhaW4pCkVNQV9EYXRhJHBoeXNpY2FsX2h1bmdlcjwtICg0K0VNQV9EYXRhJHBoeXNpY2FsX2h1bmdlcikKRU1BX0RhdGEkcGh5c2ljYWxfdGVtcDwtICg0K0VNQV9EYXRhJHBoeXNpY2FsX3RlbXApCiNUb3RhbApFTUFfRGF0YSRwaHlzaWNhbF90b3Q8LXJvd1N1bXMoRU1BX0RhdGFbLGMoInBoeXNpY2FsX3RpcmVkIiwicGh5c2ljYWxfd2VsbCIsInBoeXNpY2FsX3BhaW4iLCAicGh5c2ljYWxfaHVuZ2VyIiwicGh5c2ljYWxfdGVtcCIpXSkKCiMgQWxzbyB3aGlsZSBJbSBoZXJlIEkgZG8gdGhlIGV4Y2VyY2lzZSBJdGVtcwpFTUFfRGF0YSRldmVudF9kdXJhdGlvbltpcy5uYShFTUFfRGF0YSRldmVudF9kdXJhdGlvbildIDwtIDAKRU1BX0RhdGEkcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciA8LSgoRU1BX0RhdGEkZXZlbnRfZHVyYXRpb24pKS9tYXgoRU1BX0RhdGEkZXZlbnRfZHVyYXRpb24pCmBgYAoKIyMjIyBDZW50ZXIsIHNjYWxlLCBhbmQgbGFnIHstfQoKTmV4dCB3ZSBjZW50ZXIgdGhlIHZhcmlhYmxlcywgcmVzY2FsZSB0aGVtLCBhbmQgYWxzbyBsYWcgdGhlbSAodGVtcG9yYWwgbGFnZ2luZyAtMSkuIFRoaXMgaXMgZG9uZSBhcyBhIGxvb3AgZm9yIGVhY2ggb2YgdGhlIHN1bW1lZCBpdGVtcy4gCmBgYHtyfQojIFZhcmlhYmxlcyB0byByZXNjYWxlCnJlc2NhbGVfZW1hIDwtIGMoIm1vb2RfcG9zaXRpdmUiLCAibW9vZF9uZWdhdGl2ZSIsICJldmVudF90b3QiLCAiYWN0aXZpdHlfdG90IiwgInNvY2lhbF90b3QiLCAicGh5c2ljYWxfdG90IiwgInBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIiKQoKIyBSZXNjYWxpbmcKZm9yIChpIGluIHJlc2NhbGVfZW1hKXsKICAgICNTdWJqZWN0IE1lYW4gY2VudGVyaW5nCiAgICBjZW4gPC0gcGFzdGUoaSwgImMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbY2VuXSA8LSBjYWxjLm1jZW50KHg9RU1BX0RhdGFbW2ldXSwgaWQ9Y2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSkKICAgICMgWi1UcmFuc2Zvcm0KICAgIHp0cmFucyA8LSBwYXN0ZShpLCAieiIsIHNlcD0iXyIpCiAgICBFTUFfRGF0YVt6dHJhbnNdIDwtIHNjYWxlKEVNQV9EYXRhW1tpXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgUmVzY2FsZQogICAgc3RyYW4gPC0gcGFzdGUoaSwgInMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc3RyYW5dIDwtIHNjYWxlczo6cmVzY2FsZShFTUFfRGF0YVtbenRyYW5zXV0sIHRvPWMoMSwgMTApKQogICAgIyBHZXQgTWVhbgogICAgc21lYW4gPC0gcGFzdGUoaSwgIm0iLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc21lYW5dIDwtIGNhbGMubWVhbihFTUFfRGF0YVtbaV1dLCBpZD1TdWJfbnJfd2VlaywgZGF0YT1FTUFfRGF0YSwgZXhwYW5kPVRSVUUpCiAgICAjIFotVHJhbnNvbSBtZWFuIAogICAgbXp0cmFucyA8LSBwYXN0ZShpLCAibXoiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbXp0cmFuc10gPC0gc2NhbGUoRU1BX0RhdGFbW3NtZWFuXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgTGFnIHRoZSB2YXJpYWJsZQogICAgbGFndHJhbnMgPC0gcGFzdGUoaSwgImwiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbGFndHJhbnNdIDwtIGxhZ192YXIoeD1zdHJhbiwgaWQ9IlN1Yl9ucl93ZWVrIiwgb2JzPSJvYnMiLCBkYXk9ICJlbWFfZGF5X251bSIsIGRhdGE9RU1BX0RhdGEsIGxhZz0xKSAgIAp9CgojIEkgY2FudCBkbyB0aGlzIGluIGEgbG9vcCwgYnV0IEkgYWxzbyB3YW50IHRvIHJlc2NhbGUgdGhlIHN1YmplY3QgY2VudGVyZWQgdmFsdWVzCkVNQV9EYXRhIDwtRU1BX0RhdGEgJT4lIGdyb3VwX2J5KGNhc3Rvcl9yZWNvcmRfaWQpICU+JQogICAgbXV0YXRlKG1vb2RfcG9zaXRpdmVfY3M9IHNjYWxlczo6cmVzY2FsZShtb29kX3Bvc2l0aXZlX2MsdG89YygxLDEwKSksCiAgICAgICAgICAgbW9vZF9uZWdhdGl2ZV9jcz0gc2NhbGVzOjpyZXNjYWxlKG1vb2RfbmVnYXRpdmVfYyx0bz1jKDEsMTApKSwKICAgICAgICAgICBldmVudF90b3RfY3M9IHNjYWxlczo6cmVzY2FsZShldmVudF90b3RfYyx0bz1jKDEsMTApKSwKICAgICAgICAgICBhY3Rpdml0eV90b3RfY3M9IHNjYWxlczo6cmVzY2FsZShhY3Rpdml0eV90b3RfYyx0bz1jKDEsMTApKSwKICAgICAgICAgICBzb2NpYWxfdG90X2NzPSBzY2FsZXM6OnJlc2NhbGUoc29jaWFsX3RvdF9jLHRvPWMoMSwxMCkpLAogICAgICAgICAgIHBoeXNpY2FsX3RvdF9jcz0gc2NhbGVzOjpyZXNjYWxlKHBoeXNpY2FsX3RvdF9jLHRvPWMoMSwxMCkpKSAlPiUgdW5ncm91cCgpCmBgYAoKCiMjIyMgTWVhbiBTdHJlc3Mgey19CkFmdGVyIGRlcml2aW5nIHRoZSByZXNjYWxlZCBtZWFzdXJlcywgd2UgYWxzbyBjYWxjdWxhdGUgdGhlIG1lYW4gc3RyZXNzIHN0YXRlcyB3aGljaCB3ZSB1c2UgZm9yIHBsb3R0aW5nIG91ciB2YXJpYWJsZXMuCmBgYHtyfQojI0F2ZXJhZ2Ugc3RyZXNzIE1lYXN1cmUKRU1BX0RhdGEkbWVhbl9zdHJlc3MgPC0gcm93U3VtcyhFTUFfRGF0YVtjKCdldmVudF90b3RfeicsICdhY3Rpdml0eV90b3RfeicsICdzb2NpYWxfdG90X3onKV0sIG5hLnJtPVRSVUUpCkVNQV9EYXRhJG1lYW5fc3RyZXNzX2MgPC0gcm93U3VtcyhFTUFfRGF0YVtjKCdldmVudF90b3RfYycsICdhY3Rpdml0eV90b3RfYycsICdzb2NpYWxfdG90X2MnKV0sIG5hLnJtPVRSVUUpCkVNQV9EYXRhJG1lYW5fc3RyZXNzX3MgPC0gc2NhbGVzOjpyZXNjYWxlKEVNQV9EYXRhJG1lYW5fc3RyZXNzX2MsIHRvPWMoMSwgMTApKQpFTUFfRGF0YSRtZWFuX3N0cmVzc19sIDwtIGxhZ192YXIoeD0ibWVhbl9zdHJlc3NfYyIsIGlkPSJTdWJfbnJfd2VlayIsIG9icz0ib2JzIiwgZGF5PSAiZW1hX2RheV9udW0iLCBkYXRhPUVNQV9EYXRhLCBsYWc9MSkKCmBgYAoKIyMjIEVQQSBWYXJpYWJsZXMgey50YWJzZXR9CgpOb3cgd2UgY2FuIGNsZWFuIHVwIHNvbWUgb2YgdGhlIHBoeXNpb2xvZ3kgZGF0YS4gU2luY2UgbW9zdCBvZiB0aGUgY2xlYW5pbmcgaGFzIGFscmVhZHkgYmVlbiBkb25lIGluIHB5dGhvbiwgb25seSBtb3JlIGJhc2ljIHByb2Nlc3NpbmcgaXMgZG9uZSBoZXJlLiBGb3IgZXhhbXBsZSwgdGhlcmUgd2FzIG9uZSB3YXRjaCB0aGF0IGhhZCBhIGZhdWx0eSB0ZW1wZXJhdHVyZSBzZW5zb3IuIFRvIGF2b2lkIGxvc2luZyBkYXRhIGZvciBhIHZhcmlhYmxlIGluIG91ciBjb3ZhcmlhdGVzIG9ubHksIHdlIHJlcGxhY2UgdGhpcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHBvcHVsYXRpb24gaW5zdGVhZC4gCgpgYGB7ciBlY2hvPVRSVUV9CiMgQ291bnQgb2YgcmVwbGFjZWQgZW50cmllcwpuX3RlbXAgPC0gY291bnQoRU1BX0RhdGEkdGVtcF9tZWFuID4gNTApCm5fcmVwbGFjZSA8LSBuX3RlbXAkZnJlcVsyXQojIFN1YnNldCBkYXRhZnJhbWUgd2l0aCBub3JtYWwgdmFsdWVzCnRlbXBfZGYgPC0gRU1BX0RhdGEKdGVtcF9kZiA8LSBmaWx0ZXIodGVtcF9kZiwgdGVtcF9kZiR0ZW1wX21lYW4gPCA1MCkKIyBDb252ZXJ0IG1lYW4gbmFucyB0byAwIHRvIGFwcGx5IGNvbmRpdGlvbiByZXBsYWNlbWVudApFTUFfRGF0YSR0ZW1wX21lYW5baXMubmEoRU1BX0RhdGEkdGVtcF9tZWFuKV0gPC0gMAoKIyBMb29wIG92ZXIgdGVtcGVyYXR1cmUgdmFsdWVzIGZvciByZXBsYWNlbWVudAp0ZW1wX3ZhcmlhYmxlcyA8LSBsaXN0KCJ0ZW1wX21lZGlhbiIsICJ0ZW1wX3NkIiwgInRlbXBfc2xvcGUiLCAidGVtcF9tZWFuIikKZm9yIChpIGluIHRlbXBfdmFyaWFibGVzKXsKICAgICMgR2V0IHRoZSBtZWFuIGFuZCBTRCB0byByZXBsYWNlIHZhbHVlcyAKICAgIG1lYW5fdCA8LSBtZWFuKCh0ZW1wX2RmW1tpXV0pLCBuYS5ybT1UKQogICAgc2RfdDwtIHNkKCh0ZW1wX2RmW1tpXV0pLG5hLnJtPVQpCiAgICAjIFJlcGxhY2UgTWVhbiBUZW1wIHdpdGggZGlzdHJpYnV0aW9uCiAgICB0ZW1wX3ZlY3QgPC0gcnVuaWYobj1uX3JlcGxhY2UsIG1pbiA9IChtZWFuX3Qtc2RfdCksIG1heCA9KG1lYW5fdCtzZF90KSkgIyBWZWN0b3IgZm9yIHJlcGxhY2VtZW50cwogICAgRU1BX0RhdGFbaV0gPC0gcmVwbGFjZShFTUFfRGF0YVtbaV1dLCAoRU1BX0RhdGEkdGVtcF9tZWFuPjUwKSwgdGVtcF92ZWN0KQp9CgojIFJldmVydCAwIHRvIE5BTgpFTUFfRGF0YSR0ZW1wX21lYW5bRU1BX0RhdGEkdGVtcF9tZWFuPT0wXSA8LSBOQQoKYGBgCgoKU2Vjb25kLCBpbiB0aGUgcHl0aG9uIHNjcmlwdCwgaWYgbm8gc2tpbiBjb2R1Y3RhbmNlIHJlc3BvbnNlcyBhcmUgZGV0ZWN0ZWQsIG91ciBwaXBlbGluZSByZXR1cm5zIE5hTnMuIFRoaXMgaXMgbm90IGFuIGFkZXF1YXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhLCBhbmQgYXMgc3VjaCwgd2UgcmVwbGFjZSBwZXJpb2RzIHdoZXJlIHNpZ25hbCB3YXMgZGV0ZWN0ZWQsIGJ1dCBubyByZXNwb25zZXMgd2VyZSBkZXRlY3RlZCB3aXRoIDAuIAoKYGBge3J9CkVNQV9EYXRhJHNjX3BoYXNpY19kdXJbKCFpcy5uYShFTUFfRGF0YSRzY190b25pY19tZWFuKSkgJiAoaXMubmEoRU1BX0RhdGEkc2NfcGhhc2ljX2R1cikpXSA8LSAwCkVNQV9EYXRhJHNjX3BoYXNpY19udW1bKCFpcy5uYShFTUFfRGF0YSRzY190b25pY19tZWFuKSkgJiAoaXMubmEoRU1BX0RhdGEkc2NfcGhhc2ljX251bSkpXSA8LSAwCkVNQV9EYXRhJHNjX3BoYXNpY19tYWdbKCFpcy5uYShFTUFfRGF0YSRzY190b25pY19tZWFuKSkgJiAoaXMubmEoRU1BX0RhdGEkc2NfcGhhc2ljX21hZykpXSA8LSAwCgpgYGAgCgpXZSB3aWxsIGZpbmFsbHkgc3ViamVjdCBjZW50ZXIsIHJlc2NhbGUsIGFuZCBtZWFuIGNlbnRlciB0aGUgRVBBIGRhdGEgc2ltYWxyIHRvIHRoZSBFTUEgZGF0YS4gV2UgZG8gdGhpcyBmb3IgZWFjaCBvZiBvdXIgbWVhc3VyZXMgYmVsb3cuCgojIyMjIEhlYXJ0IFJhdGUgey19CmBgYHtyfQojIFZhcmlhYmxlcyB0byByZXNjYWxlCnJlc2NhbGVfcGh5IDwtIGMoImhyX21lYW4iLCAiaHJfc2QiLCAiaHJfbWluIiwgImhyX21heCIsICJpYmlfbWVhbiIsICJpYmlfc2QiKQoKIyBSZXNjYWxpbmcKZm9yIChpIGluIHJlc2NhbGVfcGh5KXsKICAgICNTdWJqZWN0IE1lYW4gY2VudGVyaW5nCiAgICBjZW4gPC0gcGFzdGUoaSwgImMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbY2VuXSA8LSBjYWxjLm1jZW50KHg9RU1BX0RhdGFbW2ldXSwgaWQ9Y2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSkKICAgICMgWi1UcmFuc2Zvcm0KICAgIHp0cmFucyA8LSBwYXN0ZShpLCAieiIsIHNlcD0iXyIpCiAgICBFTUFfRGF0YVt6dHJhbnNdIDwtIHNjYWxlKEVNQV9EYXRhW1tpXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgUmVzY2FsZQogICAgc3RyYW4gPC0gcGFzdGUoaSwgInMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc3RyYW5dIDwtIHNjYWxlczo6cmVzY2FsZShFTUFfRGF0YVtbenRyYW5zXV0sIHRvPWMoMSwgMTApKQogICAgIyBHZXQgTWVhbgogICAgc21lYW4gPC0gcGFzdGUoaSwgIm0iLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc21lYW5dIDwtIGNhbGMubWVhbihFTUFfRGF0YVtbaV1dLCBpZD1TdWJfbnJfd2VlaywgZGF0YT1FTUFfRGF0YSwgZXhwYW5kPVRSVUUpCiAgICAjIFotVHJhbnNvbSBtZWFuIAogICAgbXp0cmFucyA8LSBwYXN0ZShpLCAibXoiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbXp0cmFuc10gPC0gc2NhbGUoRU1BX0RhdGFbW3NtZWFuXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgTGFnIHRoZSB2YXJpYWJsZQogICAgbGFndHJhbnMgPC0gcGFzdGUoaSwgImwiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbGFndHJhbnNdIDwtIGxhZ192YXIoeD1zdHJhbiwgaWQ9IlN1Yl9ucl93ZWVrIiwgb2JzPSJvYnMiLCBkYXk9ICJlbWFfZGF5X251bSIsIGRhdGE9RU1BX0RhdGEsIGxhZz0xKSAgIAp9CgoKIyBOb3cgdG8gZ2V0IGNzIHZhbHVlcwpFTUFfRGF0YSA8LUVNQV9EYXRhICU+JSBncm91cF9ieShjYXN0b3JfcmVjb3JkX2lkKSAlPiUKICAgIG11dGF0ZShocl9tZWFuX2NzPSBzY2FsZXM6OnJlc2NhbGUoaHJfbWVhbl9jLHRvPWMoMSwxMCkpLAogICAgICAgICAgIGhyX21pbl9jcz0gc2NhbGVzOjpyZXNjYWxlKGhyX21pbl9jLHRvPWMoMSwxMCkpLAogICAgICAgICAgIGhyX21heF9jcz0gc2NhbGVzOjpyZXNjYWxlKGhyX21heF9jLHRvPWMoMSwxMCkpKSAlPiUgdW5ncm91cCgpCgpgYGAKCiMjIyMgU2tpbiBDb25kdWN0YW5jZSB7LX0KYGBge3J9CgojIFZhcmlhYmxlcyB0byByZXNjYWxlCnJlc2NhbGVfcGh5IDwtIGMoInNjX3RvbmljX21lYW4iLCAic2NfcGhhc2ljX21lYW4iLCAic2NfcGhhc2ljX21hZyIgLCAic2NfcGhhc2ljX2R1ciIsICJzY19waGFzaWNfbnVtIiwgInNjX3BoYXNpY19hdWMiKQoKIyBSZXNjYWxpbmcKZm9yIChpIGluIHJlc2NhbGVfcGh5KXsKICAgICNTdWJqZWN0IE1lYW4gY2VudGVyaW5nCiAgICBjZW4gPC0gcGFzdGUoaSwgImMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbY2VuXSA8LSBjYWxjLm1jZW50KHg9RU1BX0RhdGFbW2ldXSwgaWQ9Y2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSkKICAgICMgWi1UcmFuc2Zvcm0KICAgIHp0cmFucyA8LSBwYXN0ZShpLCAieiIsIHNlcD0iXyIpCiAgICBFTUFfRGF0YVt6dHJhbnNdIDwtIHNjYWxlKEVNQV9EYXRhW1tpXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgUmVzY2FsZQogICAgc3RyYW4gPC0gcGFzdGUoaSwgInMiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc3RyYW5dIDwtIHNjYWxlczo6cmVzY2FsZShFTUFfRGF0YVtbenRyYW5zXV0sIHRvPWMoMSwgMTApKQogICAgIyBHZXQgTWVhbgogICAgc21lYW4gPC0gcGFzdGUoaSwgIm0iLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbc21lYW5dIDwtIGNhbGMubWVhbihFTUFfRGF0YVtbaV1dLCBpZD1TdWJfbnJfd2VlaywgZGF0YT1FTUFfRGF0YSwgZXhwYW5kPVRSVUUpCiAgICAjIFotVHJhbnNvbSBtZWFuIAogICAgbXp0cmFucyA8LSBwYXN0ZShpLCAibXoiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbXp0cmFuc10gPC0gc2NhbGUoRU1BX0RhdGFbW3NtZWFuXV0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICMgTGFnIHRoZSB2YXJpYWJsZQogICAgbGFndHJhbnMgPC0gcGFzdGUoaSwgImwiLCBzZXA9Il8iKQogICAgRU1BX0RhdGFbbGFndHJhbnNdIDwtIGxhZ192YXIoeD1zdHJhbiwgaWQ9IlN1Yl9ucl93ZWVrIiwgb2JzPSJvYnMiLCBkYXk9ICJlbWFfZGF5X251bSIsIGRhdGE9RU1BX0RhdGEsIGxhZz0xKSAgIAp9CgojIE5vdyB0byBnZXQgY3MgdmFsdWVzCkVNQV9EYXRhIDwtRU1BX0RhdGEgJT4lIGdyb3VwX2J5KGNhc3Rvcl9yZWNvcmRfaWQpICU+JQogICAgbXV0YXRlKHNjX3RvbmljX21lYW5fY3M9IHNjYWxlczo6cmVzY2FsZShzY190b25pY19tZWFuX2MsdG89YygxLDEwKSksCiAgICAgICAgICAgc2NfcGhhc2ljX21hZ19jcz0gc2NhbGVzOjpyZXNjYWxlKHNjX3BoYXNpY19tYWdfYyx0bz1jKDEsMTApKSwKICAgICAgICAgICBzY19waGFzaWNfZHVyX2NzPSBzY2FsZXM6OnJlc2NhbGUoc2NfcGhhc2ljX2R1cl9jLHRvPWMoMSwxMCkpLAogICAgICAgICAgICBzY19waGFzaWNfYXVjX2NzPSBzY2FsZXM6OnJlc2NhbGUoc2NfcGhhc2ljX2F1Y19jLHRvPWMoMSwxMCkpLAogICAgICAgICAgICBzY19waGFzaWNfbnVtX2NzPSBzY2FsZXM6OnJlc2NhbGUoc2NfcGhhc2ljX251bV9jLHRvPWMoMSwxMCkpKSAlPiUgdW5ncm91cCgpCmBgYAoKIyMjIyBUZW1wZXJhdHVyZSB7LX0KYGBge3J9CgojIFRlbXAKIyBNZWFuCkVNQV9EYXRhJHRlbXBfbWVhbl9jIDwtIGNhbGMubWNlbnQodGVtcF9tZWFuLFN1Yl9ucl93ZWVrLCBkYXRhPUVNQV9EYXRhICkKRU1BX0RhdGEkdGVtcF9tZWFuX3ogPC0gc2NhbGUoRU1BX0RhdGEkdGVtcF9tZWFuLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpCkVNQV9EYXRhJHRlbXBfbWVhbl9sIDwtIGxhZ192YXIoeD0idGVtcF9tZWFuX3oiLCBpZD0iU3ViX25yX3dlZWsiLCBvYnM9Im9icyIsIGRheT0gImVtYV9kYXlfbnVtIiwgZGF0YT1FTUFfRGF0YSwgbGFnPTEpCiMgU2xvcGUKRU1BX0RhdGEkdGVtcF9zbG9wZV9jIDwtIGNhbGMubWNlbnQodGVtcF9zbG9wZSxTdWJfbnJfd2VlaywgZGF0YT1FTUFfRGF0YSApCkVNQV9EYXRhJHRlbXBfc2xvcGVfeiA8LSBzY2FsZShFTUFfRGF0YSR0ZW1wX3Nsb3BlLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpCkVNQV9EYXRhJHRlbXBfc2xvcGVfbCA8LSBsYWdfdmFyKHg9InRlbXBfc2xvcGVfeiIsIGlkPSJTdWJfbnJfd2VlayIsIG9icz0ib2JzIiwgZGF5PSAiZW1hX2RheV9udW0iLCBkYXRhPUVNQV9EYXRhLCBsYWc9MSkKIyBTRApFTUFfRGF0YSR0ZW1wX3NkX2MgPC0gY2FsYy5tY2VudCh0ZW1wX3NkLFN1Yl9ucl93ZWVrLCBkYXRhPUVNQV9EYXRhICkKRU1BX0RhdGEkdGVtcF9zZF96IDwtIHNjYWxlKEVNQV9EYXRhJHRlbXBfc2QsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKYGBgCgoKIyBEZXNjcmlwdGl2ZXMgU3RhdHMKCkJlZm9yZSBydW5uaW5nIGFueSBzdGF0cywgd2Ugc2hvdWxkIHRha2UgYSBsb29rIGF0IHNvbWUgZGVzY3JpcHRpdmUgc3RhdHMgdG8gZ2V0IGFuIG92ZXJhbGwgZmVlbCBvZiBvdXIgZGF0YS4gV2UgZG8gdGhpcyBpbiB0d28gcGFydHMsIGxvb2tpbmcgYXQgdGhlIHBvcHVsYXRpb24gZGVzY3JpcHRpdmVzLCBhbmQgdGhlbiB0aGUgcGh5c2lvbG9neSBkZXNjcmlwdGl2ZXMuCgojIyBDb21wbGlhbmNlIFJhdGVzICB7LnRhYnNldH0KCkxldHMgZmlyc3QgY2hlY2sgY29tcGxpYW5jZSByYXRlcyB0byBzZWUgaG93IHdlbGwgb3VyIHN1YmplY3RzIGFkaGVyZWQgdG8gdGhlIHNhbXBsaW5nIHNjaGVtZS4gV2UgZmlyc3QgY2hlY2sgdGhlIGNvbXBsaWFuY2UgcmF0ZXMgdW5jb3JyZWN0ZWQgZm9yIHRoZSB0aW1lIGF0IHdoaWNoIHRoZXkgd2VyZSBhY3F1aXJlZCwgZm9sbG93ZWQgYnkgY29ycmVjdGlvbiBvZiB0aGUgdGltZSBsaW1pdHMuIFdlIHNldCB0aGlzIHRvIDEgaG91ciBzaW5jZSB3ZSBvbmx5IGhhdmUgNiBzdXJ2ZXlzLCBhbmQgb3VyIHN1YmplY3RzIGhhZCB2YXJ5aW5nIHRpbWUgc2NoZWR1bGVzLiAKCiMjIyBVbmNvcnJlY3RlZCBDb21wbGlhbmNlIHstfQpDb21wbGlhbmNlIHJhdGVzIHVuY29ycmVjdGVkIGZvciB0aW1lIG9mZi1zZXRzCmBgYHtyIEVNQSBEYXRhOiBDaGVjayBjb21wbGlhbmNlfQojIFJlY29kIGNvbXBsaWFuY2UgdmFyaWFibGUKRU1BX0RhdGEkY29tcGxldGVkW0VNQV9EYXRhJHN1cnZleV9wcm9ncmVzcz09MTAwXSA8LSAxIAojIFBlciBzdWJqZWN0CmNhbGMubm9taXNzKGNvbXBsZXRlZCwgY2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSwgcHJvcD1UKQojIG1vcmUgc3VtbWFyeSBzdGF0aXN0aWNzIGZvciBjb21wbGlhbmNlCnN1bW1hcnkoY2FsYy5ub21pc3MoY29tcGxldGVkLCBjYXN0b3JfcmVjb3JkX2lkLCBkYXRhPUVNQV9EYXRhLCBwcm9wPVRSVUUpKQpgYGAKCldpdGhvdXQgY29ycmVjdGluZyBmb3IgdGltZSBvZmZzZXRzLCBvdXIgRU1BIG1lYXN1cmVzIHNlZW0gdG8gYmUgbmljZS4gTGV0cyBzZWUgaWYgSSBjb3JyZWN0IGZvciB0aW1pbmcgaWYgaXQgbWFrZXMgYSBkaWZmZXJlbmNlIG5leHQgd2hhdCB3aWxsIGhhcHBlbi4gV2Ugd2lsbCBnaXZlIHBhcnRpY2lwYW50IG9uZSBob3VyIHRvIGZpbmlzaCB0aGUgc3VydmV5LiBJZiB0aGV5IGRvbid0IGZpbmlzaCBpdCBpbiB0aGF0IHRpbWUgd2luZG93LCB3ZSB3aWxsIGNvdW50IGl0IGFzIG1pc3NpbmcuCgojIyMgQ29ycmVjdGVkIENvbXBsaWFuY2Ugey19CkNvbXBsaWFuY2UgcmF0ZXMgY29ycmVjdGluZyBmb3IgdGltZSBvZiBjb21wbGV0aW9uLiBGaXJzdCBkcm9wIGFueSBzdXJ2ZXkgdGhhdCBpcyBub3QgY29tcGxldGUgbW9yZSB0aGFuIDgwJS4gSSB0aGVuIGNyZWF0ZSBhIHZhcmlhYmxlIHRoYXQgdGVsbHMgYXMgd2hlbiB0aGUgc3VydmV5IHdhcyBjb21wbGV0ZWQgaW4gdGVybXMgb2YgdGltZSAobm90IGRhdGUpLiBJIHRoZW4gY29uZGl0aW9uYWxseSBzZXQgdGhlIGNvbXBsZXRpb24gdmFyaWFibGUgdG8gemVybyBpZiB0aGUgc3VydmV5IGRvZXMgbm90IGZhbGwgd2l0aGluIHRoZSBjb21wbGV0ZWQgdGltZSB3aW5kb3cgZ2l2ZW4gdGhlIGJlZXAuIApgYGB7ciBFTUEgRGF0YTogQ2hlY2sgQ29tcGxpYW5jZSB3aGlsZSBhY2NvdW50IGZvciBUaW1lfQoKIyBTZXQgdXAgc29tZSBzdHVmZiBmb3IgcmVwbGFjZSBhbmQgcmVmaWxsCkVNQV9EYXRhJHN1cnZleV9jb21wbGV0ZWRfb24gPC0gYXMuY2hhcmFjdGVyKEVNQV9EYXRhJHN1cnZleV9jb21wbGV0ZWRfb24pCkVNQV9EYXRhJHN1cnZleV9jb21wbGV0ZWRfdGltZSA8LSBhcy5JVGltZShFTUFfRGF0YSRzdXJ2ZXlfY29tcGxldGVkX29uKQpFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X3Byb2dyZXNzIDwgODBdIDwtIDAgCgojIFJlcGxhY2UgYW5kIHJlZmlsbCBjb25kaXRpb25hbHMgZm9yIGNvbXBsZXRpb24sIGZhY3RvcmluZyB0aW1lcwpFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMTA6MzA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09MV0gPC0gMApFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMTM6MDA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09Ml0gPC0gMApFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMTU6MzA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09M10gPC0gMApFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMTg6MDA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09NF0gPC0gMApFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMjA6MzA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09NV0gPC0gMApFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkc3VydmV5X2NvbXBsZXRlZF90aW1lID49IChhcy5JVGltZSgiMjM6MDA6MDAiKSkgJiBFTUFfRGF0YSRlbWFfYmVlcD09Nl0gPC0gMAoKIyBSZWZvcm1hdCAwIHRvIE5hbiwgYW5kIGdldCBuZXcgY29tcGxldGlvbiByYXRlcwpFTUFfRGF0YSRjb21wbGV0ZWRbRU1BX0RhdGEkY29tcGxldGVkID09IDBdIDwtIE5BCmNhbGMubm9taXNzKGNvbXBsZXRlZCwgY2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSxwcm9wPVRSVUUpCnN1bW1hcnkoY2FsYy5ub21pc3MoY29tcGxldGVkLCBjYXN0b3JfcmVjb3JkX2lkLCBkYXRhPUVNQV9EYXRhLHByb3A9VFJVRSkpCmBgYAoKIyMjIFVzYWJsZSBQaHlzaW9sb2d5IHstfQpXZSBhbHNvIGNoZWNrIHRoZSBjb21wbGV0aW9uIHJhdGVzIGZvciBwZXJpb2RzIHdoZXJlIHdlIGhhdmUgZGV0ZWN0ZWQgdXNhYmxlIHBoeXNpb2xvZ3kgaW4gb3VyIHBpcGVsaW5lLiBXZSBkbyB0aGlzIGJ5IGVzdGltYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB3aGVyZSB3ZSBzdWNjZXNzZnVsbHkgZGV0ZWN0ZWQgc2tpbiBjb25kdWN0YW5jZSwKYGBge3J9CnN1bW1hcnkoY2FsYy5ub21pc3Moc2NfdG9uaWNfbWVhbiwgY2FzdG9yX3JlY29yZF9pZCwgZGF0YT1FTUFfRGF0YSxwcm9wPVRSVUUpKQpgYGAKCldoZW4gd2UgY29ycmVjdCBmb3IgdGhlIHRpbWluZywgd2UgYWN0dWFsbHkgc3RpbGwgaGF2ZSBkZWNlbnQgY29tcGxldGlvbiByYXRlcy4gRmluYWxseSB3ZSBmaWx0ZXIgb3V0IGFsbCBpbmNvbXBsZXRlIHN1cnZleXMgYW5kIHRob3NlIG91dHNpZGUgb3VyIHRpbWUgd2luZG93cyBmb3Igb3VyIG92ZXJhbGwgYW5hbHlzaXMuIApgYGB7cn0KRU1BX0RhdGEgPC0gRU1BX0RhdGEgJT4lIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGNvbXBsZXRlZCkpIApgYGAKCgojIyBQb3B1bGF0aW9ucyBEZXNjcmlwdGl2ZXMgey50YWJzZXR9CgpXZSBuZXh0IHRha2UgYSBsb29rIGF0IHBvcHVsYXRpb24gZGVzY3JpcHRpdmUgdGhhdCB3ZSB3b3VsZCBsaWtlIHRvIHJlcG9ydC4KCiMjIyBTZXggey19CmBgYHtyfQpkZXNjcmliZShFTUFfZGVzY3IkU2V4KQpgYGAKIyMjIENvbnRyYWNlcHRpdmUgVXNlIHstfQpUaGlzIGlzIGludGVyZXN0aW5nIGZvciBvdGhlciBhbmFseXNlcyB3ZSB3YW50IHRvIGRvIHdpdGggb3RoZXIgZGF0YQpgYGB7cn0KZGVzY3JpYmUoZmFjdG9yKEVNQV9kZXNjciRDb250cmFjZXB0aXZlX3VzZSkpCmBgYAojIyMgUHJvZ3JhbSB7LX0KYGBge3J9CmRlc2NyaWJlKChFTUFfZGVzY3IkUHJvZ3JhbSkpCmBgYAojIyMgRmlyc3QgV2VlayB7LX0KYGBge3J9CmRlc2NyaWJlKEVNQV9kZXNjciRGaXJzdF9XZWVrKQpgYGAKIyMjIERheXMgQmV0d2VlbiBXZWVrcyB7LX0KYGBge3J9CiMgTnVtYmVyIG9mIGRheXMgYmV0d2VlbiB3ZWVrcwpzdW1tYXJ5KGFicyhFTUFfZGVzY3IkQ29sdW1uMSkpCmBgYAoKIyMjIFN1cnZleSBEaXNydXB0aW9uIHstfQpBc2tpbmcgd2hldGhlciB0aGUgc3VydmV5cyBkaXNydXB0ZWQgdGhlIHBhcnRpY2lwYW50cy4KYGBge3J9CnBzeWNoOjpkZXNjcmliZShFTUFfRGF0YSRwaHlzaWNhbF9kaXNydXB0aW9uKQpnZ3Bsb3QoRU1BX0RhdGEsIGFlcyh4PXBoeXNpY2FsX2Rpc3J1cHRpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSA3KQpgYGAKCgojIyBQaHlzaW9sb2d5IERlc2NyaXB0aXZlIHsudGFic2V0fQoKQWZ0ZXIgZ2V0dGluZyB0aGUgcG9wdWxhdGlvbiBkZXNjcmlwdGl2ZSwgd2Ugc2hvdWxkIG5leHQgZGVyaXZlIHNvbWUgRTQgUXVhbGl0eSBtZWFzdXJlcy4gQSBsb3Qgb2YgdGhlIGRhdGEgd2hpY2ggaXMgcG9vciBxdWFsaXR5IGlzIGFscmVhZHkgcmVtb3ZlZCBlYXJseSBvbiBpbiB0aGUgcHJlcHJvY2Vzc2luZyBwaXBlbGluZS4gSW5zdGVhZCB3ZSBjYW4gY2hlY2sgaG93IG1hbnkgcmVjb3JkaW5ncyB3ZXJlIGNhcHR1cmVkIGZvciB0aGUgSUJJIGRhdGEsIGFuZCB0aGUgb3ZlcmFsbCBtb3ZlbWVudCBkdXJpbmcgdGVzdGluZy4KCiMjIyBJQkkgQmFzZWQgUXVhbGl0eSB7LX0KVGhpcyBpcyBhIG1lYXN1cmUgb2Ygd2hhdCBkdXJhdGlvbiBvZiB0aW1lIHRoZSBkZXRlY3RlZCBoZWFydCBiZWF0cyBjb3Zlci4gU28gd2l0aGluIGEgMTBtaW51dGUgdGltZSB3aW5kb3csIHdlIHdvdWxkIHdhbnQgdG8gZGV0ZWN0IDEwIG1pbnV0ZXMgb2YgdG90YWwgSUJJIHRpbWUgaWYgd2UgaGFkIDEwMCUgc2lnbmFsLiBXZSBzZWUgdGhhdCBmb3IgdGhlIG1lYW4gaXMgMjclIG9mIHRpbWUgd2l0aCBiZWF0cyBkZXRlY3RlZCBpbnN0ZWFkLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIGRvIG5vdCBoYXZlIGVub3VnaCBkYXRhIGZvciB0ZW1wb3JhbCBkb21haW4gYW5hbHlzaXMuIApgYGB7cn0KZ2dwbG90KEVNQV9EYXRhLCBhZXMoeD1pYmlfYmFzZWRfcXVhbGl0eSwgY29sb3VyPWliaV9iYXNlZF9xdWFsaXR5KSkgKyBnZW9tX2hpc3RvZ3JhbSgpCmNvdW50KEVNQV9EYXRhJGliaV9iYXNlZF9xdWFsaXR5ID4gMC4zKQpwc3ljaDo6ZGVzY3JpYmUoRU1BX0RhdGEkaWJpX2Jhc2VkX3F1YWxpdHkpCmBgYAoKIyMjIElCSSBhbmQgQUNDIHstfQpOZXh0IHdlIHdpbGwgY2hlY2sgaWYgdGhlIElCSSBxdWFsaXR5IGlzIHJlbGF0ZWQgdG8gdGhlIEFDQyBkYXRhLiBUaGlzIGdpdmVzIHVzIGEgZ29vZCBpZGVhIG9mIGhvdyBtdWNoIG1vdGlvbiBpcyBhZmZlY3Rpbmcgb3VyIGRhdGEuIFdlIHNlZSBpdCBoYXMgYSBiaWcgaW1wYWN0LiBXaGVuIHBlb3BsZSBhcmUgbm90IG1vdmluZywgd2UgYXJlIGFibGUgdG8gZGV0ZWN0IHRoZSBlbnRpcmUgSUJJIHdpbmRvdy4gVGhpcyBtZWFucyB3ZSBzaG91bGQgaW5jbHVkZSBtb3ZlbWVudCBpbiBvdXIgbW9kZWxzLiAKYGBge3J9CmdncGxvdChFTUFfRGF0YSwgYWVzKHg9aWJpX2Jhc2VkX3F1YWxpdHksIHk9YWNjX2RlbHRhKSkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZnVsbHJhbmdlPUYgKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEwKSwgeGxpbT1jKDAsIDIuNSkpICArIGdndGhlbWUgKyB0aGVtZShheGlzLnRpY2tzLnk9ZWxlbWVudF9saW5lKHNpemU9MSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHlsYWIoIkFDQyBEZWx0YSIpICsgeGxhYiAoIklCSSBCYXNlZCBRdWFsaXR5IikKYGBgCgojIyMgSUJJIFF1YWxpdHkgYW5kIEhSIFNEIHstfQpOZXh0LCB3ZSBjaGVjayBpZiB0aGUgSUJJIFF1YWxpdHkgZWZmZWN0cyB0aGUgU0Qgb2YgdGhlIEhSIG1lYXN1cmVzLiBJdCBsb29rcyBsaWtlIGl0IGRvZXMgaGF2ZSBhbiBpbXBhY3QsIG1lYW5pbmcgd2UgbGlrZWx5IGNhbnQgdXNlIHRoYXQgbWVhc3VyZS4gCmBgYHtyfQpnZ3Bsb3QoRU1BX0RhdGEsIGFlcyh4PWliaV9iYXNlZF9xdWFsaXR5LCB5PWhyX3NkKSkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZnVsbHJhbmdlPUYgKSArIGdndGhlbWUgKyB0aGVtZShheGlzLnRpY2tzLnk9ZWxlbWVudF9saW5lKHNpemU9MSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArIHlsYWIoIkhSIFNEIikgKyB4bGFiICgiSUJJIEJhc2VkIFF1YWxpdHkiKQoKc3VtbWFyeShsbShpYmlfYmFzZWRfcXVhbGl0eSB+IGhyX3NkLCBkYXRhPUVNQV9EYXRhKSkKCmBgYAoKIyMjIFNDIGFuZCBBQ0Mgey19Ck5leHQgd2Ugd2lsbCBjaGVjayBpZiB0aGUgc2tpbiBjb25kdWN0YW5jZSBzaWduYWxzIGFyZSByZWxhdGVkIHRvIHRoZSBBQ0MuIEJhc2ljYWxseSB0aGlzIGlzIGp1c3QgZG9pbmcgZXhwbG9yYXRvcnkgYW5hbHlzaXMgdG8gZG91YmxlIGNoZWNrIHdoZXRoZXIgbW92ZW1lbnQgYWxzbyBpbXBhY3RzIHNraW4gY29uZHVjdGFuY2UgbWVhc3VyZXMuIFdlIHNlZSBoZXJlIHRoYXQgaXQgYWxzbyBkb2VzIGluZGVlZCBpbXBhY3Qgb3VyIG1lYXN1cmVzLiAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCmZpZy5zY190b25pYyA8LSBnZ3Bsb3QoRU1BX0RhdGEsIGFlcyh4PXNjX3RvbmljX21lYW4sIHk9YWNjX2RlbHRhKSkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZnVsbHJhbmdlPUYgKSAgICsgZ2d0aGVtZSArIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2xpbmUoc2l6ZT0xKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsgeWxhYigiQUNDIERlbHRhIikgKyB4bGFiICgiU0MgVG9uaWMiKSAgCmZpZy5zY19tYWcgPC0gZ2dwbG90KEVNQV9EYXRhLCBhZXMoeD1zY19waGFzaWNfbWFnLCB5PWFjY19kZWx0YSkpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGZ1bGxyYW5nZT1GICkgICArIGdndGhlbWUgKyB0aGVtZShheGlzLnRpY2tzLnk9ZWxlbWVudF9saW5lKHNpemU9MSkpICsgeGxhYiAoIlNDIE1hZyIpIAoKZmlnLnNjX251bSA8LSBnZ3Bsb3QoRU1BX0RhdGEsIGFlcyh4PXNjX3BoYXNpY19udW0sIHk9YWNjX2RlbHRhKSkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZnVsbHJhbmdlPUYgKSAgICsgZ2d0aGVtZSArIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2xpbmUoc2l6ZT0xKSkgKyB4bGFiICgiU0MgTnVtIikgCgpmaWcuc2NfYXVjIDwtIGdncGxvdChFTUFfRGF0YSwgYWVzKHg9c2NfcGhhc2ljX2F1YywgeT1hY2NfZGVsdGEpKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBmdWxscmFuZ2U9RiApICAgKyBnZ3RoZW1lICsgdGhlbWUoYXhpcy50aWNrcy55PWVsZW1lbnRfbGluZShzaXplPTEpKSArICB4bGFiICgiU0MgQVVDIikgCgpmaWcuc2NfZHVyIDwtIGdncGxvdChFTUFfRGF0YSwgYWVzKHg9c2NfcGhhc2ljX2R1ciwgeT1hY2NfZGVsdGEpKSArIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBmdWxscmFuZ2U9RiApICAgKyBnZ3RoZW1lICsgdGhlbWUoYXhpcy50aWNrcy55PWVsZW1lbnRfbGluZShzaXplPTEpKSArIHhsYWIgKCJTQyBEdXIiKSAgCgpmaWcudGVtcF9tZWFuIDwtIGdncGxvdChFTUFfRGF0YSwgYWVzKHg9cGh5c2ljYWxfZXhjZXJjaXNlX2R1ciwgeT1hY2NfZGVsdGEsIGNvbG91cj0icmVkIikpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsgZ2d0aGVtZSAKZ2dhcnJhbmdlKGZpZy5zY190b25pYywgZmlnLnNjX21hZywgZmlnLnNjX251bSwgZmlnLnNjX2F1YywgZmlnLnNjX2R1ciwgZmlnLnRlbXBfbWVhbikKCmBgYAoKIyMjIFNDIE1hZyBhbmQgbnVtYmVyIHstfQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWcuc2NfbWFnIDwtIGdncGxvdChFTUFfRGF0YSwgYWVzKHg9c2NfcGhhc2ljX21hZywgeT1zY19waGFzaWNfbnVtKSkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZnVsbHJhbmdlPUYgKSAgICsgZ2d0aGVtZSArIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2xpbmUoc2l6ZT0xKSkgKyB4bGFiICgiU0MgTWFnIikgCmZpZy5zY19tYWcKYGBgCgojIyBUcmVuZHMgaW4gRU1BCldlIGZpbmFsbHkgcGxvdCB0aGUgZ3JhcGhzIG9mIHRoZSBFTUEgaXRlbXMgb3ZlciB0aW1lIGluIGVhY2ggb2YgdGhlIHdlZWtzIGZvciBzb21lIGV4cGxvcmF0b3J5IGFuYWx5c2lzLldlIHNlZSBoZXJlIHRoYXQgdGhlcmUgaXMgYW4gZWZmZWN0IG9mIHRpbWUgKGhpZ2hlciBzdHJlc3MgaW4gbWlkLWRheSksIGFuZCBhbiBlZmZlY3Qgb2YgZGF5LiBUaGUgY2xvc2VyIHRoZXkgYXJlIHRvIGV4YW1zLCB0aGUgbW9yZSBzdHJlc3NlZCB0aGV5IGFyZS4gVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlc2UgaW4gb3VyIG1vZGVscy4gCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgp2YXJzLmVtYSA8LSBjKCAiZXZlbnRfdG90X3oiLCAiYWN0aXZpdHlfdG90X3oiLCAic29jaWFsX3RvdF96IiwgInBoeXNpY2FsX3RvdF96IiwgIm1vb2RfcG9zaXRpdmVfeiIsICJtb29kX25lZ2F0aXZlX3oiKQpmb3IgKCBpIGluIHZhcnMuZW1hKSB7CiAgICBwMSA8LSBnZ3Bsb3QoRU1BX0RhdGEsIGFlcyh5PWdldChpKSwgeD1lbWFfc3VydmV5LCBjb2xvdXI9V2Vla19UeXBlLCBmaWxsPVdlZWtfVHlwZSkpICsgZ2VvbV9saW5lKHN0YXQ9InN1bW1hcnkiKSArIGdlb21fcmliYm9uKHN0YXQ9InN1bW1hcnkiLCBhbHBoYT0wLjMsIGNvbG9yPU5BKSArIHNjYWxlX3hfY29udGludW91cygpICsgeWxhYihpKQogIHByaW50KHAxKQp9CgpgYGAKCi4KCiMjIEFnZ3JlZ2F0ZSBTdHJlc3Mgey50YWJzZXR9CgpBZnRlciBwbG90dGluZyBvdXIgdmFyaWFibGVzIG92ZXIgYWxsIHRoZSB3ZWVrLCBpdCB3aWxsIGJlIGludGVyZXN0aW5nIHRvIGNoZWNrIHRoZSBhZ2dyZWdhdGUgc3RyZXNzIGNoYW5nZXMsIGFuZCBob3cgZWFjaCBzdWJqZWN0cyBzdHJlc3MgcmVhY3Rpdml0eSBsb29rcyBsaWtlLiBGb3IgdGhpcywgd2UgbWFrZSBhbiBhdmVyYWdlIGRhdGFmcmFtZSBhY3Jvc3MgdGhlIHdlZWtzLCBzbyB3ZSBjYW4gbG9vayBhdCB0aGUgYXZlcmFnZSBjaGFuZ2UgaW4gbW9vZC4gCgpgYGB7ciBQbG90OiBBZ2dyZWdhdGUgYW5kIFN0cmVzcyBDaGFuZ2UsIHdhcm5pbmc9RkFMU0V9CiNBdmVyYWdlIFN0cmVzcyBwZXIgV2VlazoKRU1BX2F2ZyA8LSBFTUFfRGF0YQojIE5vdyBJIGNhbiBkbyBzb21lIG1lcmdpbmcKRU1BX2F2ZyA8LSBhZ2dyZWdhdGUoRU1BX2F2ZywgYnk9bGlzdChFTUFfYXZnJGNhc3Rvcl9yZWNvcmRfaWQsIEVNQV9hdmckV2Vla19UeXBlKSwgRlVOPW1lYW4sIG5hLnJtPVQsIG5hLndhcm49RikKRU1BX2F2ZyRjYXN0b3JfcmVjb3JkX2lkIDwtIEVNQV9hdmckR3JvdXAuMQpFTUFfYXZnJFdlZWtfVHlwZSA8LSBFTUFfYXZnJEdyb3VwLjIKRU1BX2F2ZyRXZWVrX1R5cGUgPC0gZmFjdG9yKEVNQV9hdmckV2Vla19UeXBlLCBsZXZlbHM9YygnQ29udHJvbCcsJ1N0cmVzcycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygnQ29udHJvbCcsJ0V4YW0nKSkKCiMgU3BsaXQgdGhlIGF2ZXJhZ2VkIERGIHRvIGNvbnRyb2wgYW5kIHN0cmVzcyB3ZWVrCkVNQV9hdmdfZXhhbSA8LSBzdWJzZXQoRU1BX2F2ZywgV2Vla19UeXBlPT0iRXhhbSIpIApFTUFfYXZnX2NvbnRyb2wgPC0gc3Vic2V0KEVNQV9hdmcsIFdlZWtfVHlwZSE9IkV4YW0iKSAKCiMgTWVyZ2UgYnkgd2VlayB0byBjYWxjdWxhdGUgY2hhbmdlCkVNQV9hdmdfd2lkZSA8LSAgbWVyZ2UoRU1BX2F2Z19leGFtLCBFTUFfYXZnX2NvbnRyb2wsIGJ5PSdjYXN0b3JfcmVjb3JkX2lkJywgc3VmZml4ZXM9YygnX2V4YW0nLCAnX2NvbnRyb2wnKSkKCiMgTWFrZSBBZ2dyZWdhdGVkIHZhcmlhYmxlcyAKRU1BX2F2Z193aWRlJG1vb2RfcG9zaXRpdmUgPC0oKEVNQV9hdmdfd2lkZSRtb29kX3Bvc2l0aXZlX2NvbnRyb2wgKyBFTUFfYXZnX3dpZGUkbW9vZF9wb3NpdGl2ZV9leGFtKS8yKQpFTUFfYXZnX3dpZGUkbW9vZF9uZWdhdGl2ZSA8LSgoRU1BX2F2Z193aWRlJG1vb2RfbmVnYXRpdmVfY29udHJvbCArIEVNQV9hdmdfd2lkZSRtb29kX25lZ2F0aXZlX2V4YW0pLzIpCkVNQV9hdmdfd2lkZSRhY3Rpdml0eV90b3QgPC0oKEVNQV9hdmdfd2lkZSRhY3Rpdml0eV90b3RfY29udHJvbCArIEVNQV9hdmdfd2lkZSRhY3Rpdml0eV90b3RfZXhhbSkvMikKRU1BX2F2Z193aWRlJHNvY2lhbF90b3QgPC0oKEVNQV9hdmdfd2lkZSRzb2NpYWxfdG90X2NvbnRyb2wgKyBFTUFfYXZnX3dpZGUkc29jaWFsX3RvdF9leGFtKS8yKQpFTUFfYXZnX3dpZGUkZXZlbnRfdG90IDwtKChFTUFfYXZnX3dpZGUkZXZlbnRfdG90X2NvbnRyb2wgKyBFTUFfYXZnX3dpZGUkZXZlbnRfdG90X2V4YW0pLzIpCkVNQV9hdmdfd2lkZSRwaHlzaWNhbF90b3QgPC0oKEVNQV9hdmdfd2lkZSRwaHlzaWNhbF90b3RfY29udHJvbCArIEVNQV9hdmdfd2lkZSRwaHlzaWNhbF90b3RfZXhhbSkvMikKCiMgTWFrZSBzdHJlc3MgY2hhbmdlLCBhbmQgbWVhbiBjZW50cmVyIGl0CkVNQV9hdmdfd2lkZSRzdHJlc3NfcmVhY3Rpdml0eSA8LSBFTUFfYXZnX3dpZGUkbWVhbl9zdHJlc3NfZXhhbSAtIEVNQV9hdmdfd2lkZSRtZWFuX3N0cmVzc19jb250cm9sCkVNQV9hdmdfd2lkZSRzdHJlc3NfcmVhY3Rpdml0eV9jIDwtIEVNQV9hdmdfd2lkZSRtZWFuX3N0cmVzc19jX2V4YW0gLSBFTUFfYXZnX3dpZGUkbWVhbl9zdHJlc3NfY19jb250cm9sCkVNQV9hdmdfd2lkZSRzdHJlc3NfcmVhY3Rpdml0eV96IDwtIHNjYWxlKEVNQV9hdmdfd2lkZSRzdHJlc3NfcmVhY3Rpdml0eSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQoKYGBgCgoKIyMjIE1lYW4gQ2hhbmdlIGluIFN0cmVzcyB7LX0KYGBge3J9CiNCb3ggUGxvdAptZWFuX2JveCA8LSBnZ3Bsb3QoRU1BX2F2ZywgYWVzKHk9bWVhbl9zdHJlc3MsIHg9V2Vla19UeXBlLCBjb2xvdXI9V2Vla19UeXBlLGZpbGw9V2Vla19UeXBlLCBuYS5ybSA9IFRSVUUpKSArCiAgZ2VvbV9ib3hwbG90KGFscGhhPTEvMikgKyBnZW9tX2ppdHRlcih3aWR0aD0wLjEsIGFscGhhPTEvMikrCiAgc2NhbGVfeV9jb250aW51b3VzKCkrIHNjYWxlX3hfZGlzY3JldGUoKSsKICBnZ3RpdGxlKCJTdHJlc3MgTGV2ZWxzIHBlciBXZWVrIikrCiAgeGxhYigiIikgKyB5bGFiKCJBZ2dyZWdhdGVkIHN0cmVzcyBtZWFzdXJlXG4iKSsgZ2d0aGVtZQptZWFuX2JveCAjKyBjb29yZF9maXhlZChyYXRpbz0xKQpgYGAKCiMjIyBTdHJlc3MgUmVjdGl2aXR5IEhlYXQgUGxvdCB7LX0KYGBge3J9CnNjYXRfc3RyIDwtIGdncGxvdCAoRU1BX2F2Z193aWRlLCBhZXMoeT1zdHJlc3NfcmVhY3Rpdml0eV9jLCB4PTAsIGNvbG91cj1zdHJlc3NfcmVhY3Rpdml0eV9jKSApICsKICAgIGdlb21faml0dGVyKCB3aWR0aCA9IDAuNywgYWxwaGE9MC43NSwgc2l6ZSA9IDIpICsgc2NhbGVfeF9jb250aW51b3VzKCkrCiAgICBnZ3RpdGxlKCJJbmRpdmlkdWFsIFN0cmVzcyBSZWFjdGl2aXR5IHRvIEV4YW1zXG4iKSt5bGFiKCJTdHJlc3NcblJlYWN0aXZpdHlcbiIpK2xhYnMoY29sb3IgPSAiU3RyZXNzXG5SZWFjdGl2aXR5XG4iKSsKICAgIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTgsICBmYW1pbHk9IkNhbWJyaWEiKSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dCAoc2l6ZT0yMCwgaGp1c3Q9MC41KSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSxheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTgpLGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoc2l6ZT0xOCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSJ3aGl0ZSIpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfbGluZShzaXplPTMpLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImFsaWNlYmx1ZSIpKQpzY2F0X3N0ciArIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIpICsgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTUsNSkpCmBgYAogCiAgCgojIEluZmVyZW50aWFsIFN0YXRzCgpXZSBjYW4gbm93IHJ1biB0aGUgYWN0dWFsIHN0YXRpc3RpY3MuIFdlIHVzZSBtaXhlZCBlZmZlY3RzIG1vZGVscyB0byBmaXJzdCB2YWxpZGF0ZSBvdXIgcGFyYWRpZ20gYnkgbG9va2luZyBhdCBvdmVyYWxsIGNoYW5nZXMgaW4gb3VyIHN1YmplY3RpdmUgc3RyZXNzIG1lYXN1cmVzIGJldHdlZW4gdGhlIHR3byB3ZWVrcy4gV2UgdGhlbiBnbyBvbmUgdG8gaW52ZXN0aWdhdGUgdGhlIGVmZmVjdHMgb2YgdGhlIHN0cmVzcyBleHBvc3VyZSAoaS5lLiwgc3RyZXNzIHdlZWspIG9uIG91ciBvdXRjb21lcyBvZiBhZmZlY3QgYW5kIGFyb3VzYWwuIFdlIGZpbmFsbHkgaW52ZXN0aWdhdGUgYW5kIGV4cGxvcmUgdGhlIG1vbWVudC10by1tb21lbnQgYXNzb2NpYXRpb25zIGJldHdlZW4gc3ViamVjdGl2ZSBzdHJlc3MgYW5kIHRoZSBvdXRjb21lcywgYW5kIHRoZW4gZnVydGhlciBleHBsb3JlIHRoZXNlIGVmZmVjdHMgd2l0aCBmb2xsb3ctdXAgYW5hbHlzZXMgYW5kIGEgbWVkaWF0aW9uIGFuYWx5c2lzLiAKCkFsbCBvdXIgbW9kZWxzIGFyZSBmaXQgaW4gYSBtYXhpbWFsIGFwcHJvYWNoLiBXZSBmaXQgZml4ZWQgZWZmZWN0cyBmb3IgYWxsIHRoZSBtYWluIGVmZmVjdCBvZiBpbnRlcmVzdCwgd2l0aCBhIHJhbmRvbSBzbG9wZS4gV2UgYWxzbyBmaXQgZml4ZWQgZWZmZWN0cyB3aXRoIGZpeGVkIHNsb3BlcyBmb3IgYWxsIHRoZSBjb3ZhcmlhdGVzLiBJZiBhIGNvdmFyaWF0ZSBpcyBjYXRlZ29yaWNhbCB3aXRoIGZld2VyIHRoYW4gNiBsZXZlbHMsIHRoZW4gd2Ugb25seSBmaXQgZml4ZWQgZWZmZWN0cyBhbmQgbm8gcmFuZG9tIHNsb3Blcy4gRmluYWxseSwgd2UgbW9kZWwgc3ViamVjdCBhcyB0aGUgbWFpbiByYW5kb20gZWZmZWN0LiBGb3IgZWFjaCBtb2RlbCwgd2UgdGVzdCB0aGUgbXVsdGlwbGUgZmFtaWxpZXMgYW5kIGxpbmtzLCBhbmQgdXNpbmcgdGhlIEFJQyBhbmQgcmVzaWR1YWwgZml0LCB3ZSBzZWxlY3QgdGhlIGJlc3QgbW9kZWwuIEluIHRoZSByZXN1bHRzIGJlbG93LCB3ZSBwcmVzZW50IHRoZSBmaW5hbCBzZWxlY3RlZCBtb2RlbHMgZm9yIGJyZXZpdHkuIE1vZGVscyBhcmUgY29tbWVudGVkIHdoZW4gcHJvZHVjaW5nIHRoaXMgbm90ZWJvb2sgdG8gc2ltcGxpZnkgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGh0bWwgZmlsZS4gCgpBZGRpdGlvbmFsbHksIHdlIGNoZWNrIG1vZGVscyBmb3IgbXVsaXRjb2xpbmVhcml0eSB1c2luZyBtb2RlbHMgd2l0aG91dCBpbnRlcmFjdGlvbiB0ZXJtcy4gTW9kZWxzIHJlcG9ydGVkIGhlcmUgYXJlIHRoZSBmaW5hbCBvbmVzLCB3aXRoIHRoZSBpbnRlcmFjdGlvbiB0ZXJtcyB3aGljaCBpbmZsYXRlcyBtdWx0aWNvbGluZWFyaXR5IGVzdGltYXRlcy4KCgojIyBXZWVrIHZzIFdlZWsgRGlmZmVyZW5jZXMKClRoZSBmaXJzdCBzZXQgb2YgYW5hbHlzaXMgbG9vayBhdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzdHJlc3MgYW5kIGNvbnRyb2wgd2Vla3MuIFdlIG1vZGVsIHRoaXMgYXMgYSBmaXhlZCBlZmZlY3QsIGFuZCBhZGRpdGlvbmFsbHkgbW9kZWwgY292YXJpYXRlcyBhcyBmaXhlZCBlZmZlY3RzIGZvciBzZXgsIHN0dWR5IHByb2dyYW0sIHdlZWsgb3JkZXIsIGRheSBhbmQgdGltZSwgbW92ZW1lbnQsIGFuZCBleGVyY2lzZS4gV2UgbW9kZWwgZml4ZWQgc2xvcGVzIGZvciB0aGUgY292YXJpYXRlcyB3aXRoIG11bHRpcGxlIGxldmVscywgYW5kIGEgcmFuZG9tIHNsb3BlIGZvciB0aGUgZml4ZWQgZWZmZWN0IG9mIGludGVyZXN0LgoKIyMjIFN1YmplY3RpdmUgU3RyZXNzIHsudGFic2V0IH0KClRoZSBmaXJzdCBtb2RlbHMgd2lsbCBsb29rIGF0IHRoZSBzdWJqZWN0aXZlIHN0cmVzcyBtZWFzdXJlcywgYW5kIGhvdyB0aG9zZSBjaGFuZ2UgYmV0d2VlbiB0aGUgd2Vla3MuIEJhc2VkIG9uIHRoZXNlIG1vZGVscywgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgb3ZlcmFsbCBlZmZlY3Qgb2Ygd2VlayB0eXBlIG9uIG1vc3Qgb2Ygb3VyIHN0cmVzcyBtZWFzdXJlcywgd2hpY2ggaXMgZ3JlYXQuIE91ciBzdHJlc3MgaW5kdWN0aW9uIGlzIHdvcmtpbmcuIFRoaXMgbWVhbnMgd2UgaGF2ZSBoaWdoZXIgc3ViamVjdGl2ZSBzdHJlc3MgaW4gb3VyIHN0cmVzcyB3ZWVrLCBpbmRpY2F0aW5nIG91ciBkZXNpZ24gaXMgYWNoaWV2aW5nIGl0cyBnb2FsLiAKCgojIyMjIEV2ZW50IFJlbGF0ZWQgU3RyZXNzIHstfQpFdmVudCByZWxhdGVkIHN0cmVzcyBpcyByZWxhdGVkIHRvIHRoZSBtb3N0IHByb21pbmVudCBldmVudCBwYXJ0aWNpcGFudHMgZXhwcmVpbmNlZCBpbiBiZXR3ZWVuIHRoZSBzdXJ2ZXlzLgpgYGB7cn0KIyBNb2RlbAojIGdsbWVyLmV2ZW50X3dlZWsgPC0gbG1lcihldmVudF90b3RfcyB+IFdlZWtfVHlwZSArICAjTW9kZWwgd2VlawojICAgICBTZXggKyBQcm9ncmFtICsgICMgTW9kZWwgc2V4IGFuZCBwcm9ncmFtIAojICAgICBGaXJzdF9XZWVrICsgZW1hX2RheSplbWFfYmVlcF9mICsgIyBNb2RlbCBkYXkgcmVsYXRlZCBpdGVtcwojICAgICBhY2NfZGVsdGEgKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSpwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgIyBNb2RlbCBtb3ZlbWVudAojICAgICAoMStXZWVrX1R5cGV8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArZW1hX3N1cnZleXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDF8Y2FzdG9yX3JlY29yZF9pZDplbWFfZGF5OmVtYV9iZWVwX2YpLAojICAgICBkYXRhPUVNQV9EYXRhLAojICAgICAjZmFtaWx5PWdhdXNzaWFuLAojICAgICBjb250cm9sPWxtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpKQoKIyBNb2RlbCBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5ldmVudF93ZWVrKQoKYGBgCgoKCiMjIyMgQWN0aXZpdHkgUmVsYXRlZCBTdHJlc3Mgey19CkFjdGl2aXR5IHJlbGF0ZWQgc3RyZXNzIGlzIHN0cmVzcyByZWxhdGVkIHRvIHRoZSBhY3Rpdml0eSBwYXJ0aWNpcGFudHMgd2VyZSBlbmdhZ2VkIGluIGp1c3QgYmVmb3JlIHJlY2VpdmluZyB0aGUgc3VydmV5LgpgYGB7cn0KIyBNb2RlbAojIGdsbWVyLmFjdGl2aXR5X3dlZWsgPC0gbG1lcihhY3Rpdml0eV90b3RfcyB+IFdlZWtfVHlwZSArICAjTW9kZWwgd2VlawojICAgICBTZXggKyBQcm9ncmFtICsgICMgTW9kZWwgc2V4IGFuZCBwcm9ncmFtIAojICAgICBGaXJzdF9XZWVrICsgZW1hX2RheSplbWFfYmVlcF9mICsgIyBNb2RlbCBkYXkgcmVsYXRlZCBpdGVtcwojICAgICBhY2NfZGVsdGEgKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSpwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgIyBNb2RlbCBtb3ZlbWVudAojICAgICAoMStXZWVrX1R5cGV8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArZW1hX3N1cnZleXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDF8Y2FzdG9yX3JlY29yZF9pZDplbWFfZGF5OmVtYV9iZWVwX2YpLAojICAgICBkYXRhPUVNQV9EYXRhLAojICAgICAjZmFtaWx5PWdhdXNzaWFuLAojICAgICBjb250cm9sPWxtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpKQoKIyBNb2RlbCBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5hY3Rpdml0eV93ZWVrICkKCmBgYAoKCgojIyMjIFNvY2lhbCBTdHJlc3Mgey19ClJlbGF0ZXMgdG8gc3RyZXNzIGRlcml2ZWQgZnJvbSBzb2NpYWwgaW50ZXJhY3Rpb25zLCBvciBsYWNrIHRoZXJlb2YuCmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuc29jaWFsX3dlZWsgPC0gZ2xtZXIoIHNvY2lhbF90b3RfcyB+IFdlZWtfVHlwZSArICAjTW9kZWwgd2VlawojICAgICBTZXggKyBQcm9ncmFtICsgICMgTW9kZWwgc2V4IGFuZCBwcm9ncmFtIAojICAgICBGaXJzdF9XZWVrICsgZW1hX2RheSplbWFfYmVlcF9mICsgIyBNb2RlbCBkYXkgcmVsYXRlZCBpdGVtcwojICAgICBhY2NfZGVsdGEgKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSpwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgIyBNb2RlbCBtb3ZlbWVudAojICAgICAoMStXZWVrX1R5cGV8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArZW1hX3N1cnZleXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDF8Y2FzdG9yX3JlY29yZF9pZDplbWFfZGF5OmVtYV9iZWVwX2YpLAojICAgICBkYXRhPUVNQV9EYXRhLAojICAgICBmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UsIG9wdEN0cmw9bGlzdChtYXhmdW49MTAwMDAwKSkpCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnNvY2lhbF93ZWVrKQoKYGBgCgoKIyMjIyBQaHlzaWNhbCBTdHJlc3Mgey19CkNvbnRyb2wgaXRlbXMgYXNzZXNzaW5nIHBoeXNpY2FsIGRpc2NvbWZvcnQgb3IgaWxsbmVzcy4gCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgTW9kZWwKIyBnbG1lci5waHlzaWNhbF93ZWVrPC0gbG1lciggcGh5c2ljYWxfdG90X3MgfiBXZWVrX1R5cGUgKyAgI01vZGVsIHdlZWsKIyAgICAgU2V4ICsgUHJvZ3JhbSArICAjIE1vZGVsIHNleCBhbmQgcHJvZ3JhbSAKIyAgICAgRmlyc3RfV2VlayArIGVtYV9kYXkqZW1hX2JlZXBfZiArICMgTW9kZWwgZGF5IHJlbGF0ZWQgaXRlbXMKIyAgICAgYWNjX2RlbHRhICsgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEqcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArICMgTW9kZWwgbW92ZW1lbnQKIyAgICAgKDErV2Vla19UeXBlfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9zdXJ2ZXl8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgxfGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwKIyAgICAgZGF0YT1FTUFfRGF0YSwKIyAgICAgI2ZhbWlseT1HYW1tYSwKIyAgICAgY29udHJvbD1sbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIucGh5c2ljYWxfd2VlaykKCmBgYCAgCgojIyMjIFJlc3VsdHM6IFN1YmplY3RpdmUgU3RyZXNzIHYgV2Vla3stfQpXZSB0YWJ1bGF0ZSB0aGUgcmVzdWx0cywgYW5kIHByb2R1Y2UgYSByZWdyZXNzaW9uIGVmZmVjdCBwbG90IHRvIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cy4gCmBgYHtyfQp0YWJsZS5zdHJlc3Nfd2VlayA8LSB0YWJfbW9kZWwoZ2xtZXIuZXZlbnRfd2VlaywgZ2xtZXIuYWN0aXZpdHlfd2VlaywgIGdsbWVyLnNvY2lhbF93ZWVrLCBnbG1lci5waHlzaWNhbF93ZWVrLCAKICAgICAgICAgICB0ZXJtcz1jKCIoSW50ZXJjZXB0KSIsIldlZWtfVHlwZSBbU3RyZXNzXSIsICJTZXggW01hbGVdIiwgIlByb2dyYW0gW0JTY19NZWRdIiwgIkZpcnN0X1dlZWsgW0V4YW0tRmlyc3RdIiwgImFjY19kZWx0YSIsICJwaHlzaWNhbF9leGNlcmNpc2VfZHVyIiksIAogICAgICAgICAgZHYubGFiZWxzPWMoIkV2ZW50IiwgIkFjdGl2aXRpeSIsICJTb2NpYWwiLCAiUGh5c2ljYWwiKSwgCiAgICAgICAgICB0aXRsZT0iVGFibGUgMS4gU3ViamVjdGl2ZSBTdHJlc3MgdnMgV2VlayBUeXBlIiwgc2hvdy5kZj1GLCBzaG93LmZzdGF0ID0gVCwKICAgICAgICAgIHRyYW5zZm9ybT1OVUxMLCAKICAgICAgICAgc2hvdy5zdGF0PVRSVUUsCiAgICAgICAgIHNob3cuc2U9VFJVRSkKaHRtbFRhYmxlOjpodG1sVGFibGUodGFibGUuc3RyZXNzX3dlZWska25pdHIpCgpgYGAKCgpgYGB7cn0KIyBTdWJzZXQgdGhlIHZhcmlhYmxlcyB3ZSB3YW50IHRvIHBsb3QKcGxvdC5tb29kX3dlZWsgPC0gcGxvdF9tb2RlbHMoZ2xtZXIuZXZlbnRfd2VlaywgZ2xtZXIuYWN0aXZpdHlfd2VlaywgZ2xtZXIuc29jaWFsX3dlZWssIGdsbWVyLnBoeXNpY2FsX3dlZWspCnJtX3Rlcm0gPC0gYXMudmVjdG9yKHBsb3QubW9vZF93ZWVrJGRhdGEkdGVybVsxOmxlbmd0aChwbG90Lm1vb2Rfd2VlayRkYXRhJHRlcm0pXSkKcm1fdGVybSA8LSBybV90ZXJtW3JtX3Rlcm0gIT0gIldlZWtfVHlwZVN0cmVzcyJdCgojIE1ha2UgdGhlIHBsb3QKcGxvdC5tb29kX3dlZWsgPC0gcGxvdF9tb2RlbHMoZ2xtZXIuZXZlbnRfd2VlaywgZ2xtZXIuYWN0aXZpdHlfd2VlaywgZ2xtZXIuc29jaWFsX3dlZWssIGdsbWVyLnBoeXNpY2FsX3dlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmxhYmVscz1jKCJFdmVudCBTdHJlc3MiLCAiQWN0aXZpdHkgU3RyZXNzIiwiU29jaWFsIFN0cmVzcyIsICJQaHlzaWNhbCBTdHJlc3MiICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLmxhYmVscyA9IGMoIiAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXN0aXN0aWNhbCBTdHVmZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtLnRlcm1zID0gcm1fdGVybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2hvdy52YWx1ZXMgPSBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN2YWx1ZS5zaXplID0gNCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3N0ZC5lc3Q9VCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdy5wPVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zaGFwZT1ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wdmFsLnRpdGxlID0gIlNpZ25pZmljYW5jZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVmlzdWFsIFN0dWZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPSIjNjY2NjY2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3Quc2l6ZT0yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZz0xICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxpbmUuY29sb3IgPSAiZGFya2dyZXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSAiIikgKyB5bGFiKCJcblBhcmFtZXRlciBFc3RpbWF0ZSAoYS51LikiKSArIHhsYWIoIlN1YmplY3RpdmUgU3RyZXNzIikgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhlbWUgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNiksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTExKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5NSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTkwIikpIAoKIyBTaG93IGFuZCBzYXZlCnBsb3QubW9vZF93ZWVrKyBjb29yZF9mbGlwKHlsaW09YygtMC42NSwwLjY1KSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5NSIpLCBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5MCIpKQpnZ3NhdmUoImZpZ3VyZXMvZmlnX1dlZWtSZXNpZF9TdWJqZWN0aXZlU3RyZXNzLnRpZmYiLHVuaXRzPSJpbiIsIHdpZHRoPTQsIGhlaWdodD00LCBkcGk9MzAwLCBjb21wcmVzc2lvbiA9ICdsencnLCBiZz0idHJhbnNwYXJlbnQiKQpgYGAKCgojIyMgTW9vZCB7LnRhYnNldH0KCk5leHQsIHdlIHdhbnQgdG8gaW52ZXN0aWdhdGUgdGhlIGltcGFjdCBvZiBhbiBleGFtaW5hdGlvbiBwZXJpb2Qgb24gbW9vZC4gQ29uY2VwdHVhbGx5LCBtb29kIGlzIGFuIG91dGNvbWUgb2YgYmVpbmcgc3RyZXNzZWQsIGFuZCBub3QgYSBkaXJlY3QgbWVhc3VyZSBvZiBzdHJlc3MuIEJlbG93IGFyZSB0aGUgcmVzdWx0cyBvZiB0aGUgbW9kZWxzIGZvciBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBtb29kLgoKIyMjIyBQb3NpdGl2ZXstfQoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBNb2RlbAojIGdsbWVyLnBvc21vb2Rfd2VlayA8LSBnbG1lciggbW9vZF9wb3NpdGl2ZV9zIH4gV2Vla19UeXBlICsgICNNb2RlbCB3ZWVrCiMgICAgIFNleCArIFByb2dyYW0gKyAgIyBNb2RlbCBzZXggYW5kIHByb2dyYW0gCiMgICAgIEZpcnN0X1dlZWsgKyBlbWFfZGF5KmVtYV9iZWVwX2YgKyAjIE1vZGVsIGRheSByZWxhdGVkIGl0ZW1zCiMgICAgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEgKyBhY2NfZGVsdGEqcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArICMgTW9kZWwgbW92ZW1lbnQKIyAgICAgKDErV2Vla19UeXBlfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9zdXJ2ZXl8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgxfGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwKIyAgICAgZGF0YT1FTUFfRGF0YSwKIyAgICAgZmFtaWx5PWdhdXNzaWFuKGxpbms9ImxvZyIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIucG9zbW9vZF93ZWVrKQoKYGBgCgojIyMjICBOZWdhdGl2ZXstfQoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBNb2RlbAojIGdsbWVyLm5lZ21vb2Rfd2VlayA8LSBnbG1lciggbW9vZF9uZWdhdGl2ZV9zIH4gIFdlZWtfVHlwZSArICAjTW9kZWwgd2VlawojICAgICBTZXggKyBQcm9ncmFtICsgICMgTW9kZWwgc2V4IGFuZCBwcm9ncmFtIAojICAgICBGaXJzdF9XZWVrICsgZW1hX2RheSplbWFfYmVlcF9mICsgIyBNb2RlbCBkYXkgcmVsYXRlZCBpdGVtcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgYWNjX2RlbHRhICsgYWNjX2RlbHRhKnBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyAjIE1vZGVsIG1vdmVtZW50CiMgICAgICgxK1dlZWtfVHlwZXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMCtlbWFfc3VydmV5fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMXxjYXN0b3JfcmVjb3JkX2lkOmVtYV9kYXk6ZW1hX2JlZXBfZiksCiMgICAgIGRhdGE9RU1BX0RhdGEsCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSkpCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLm5lZ21vb2Rfd2VlaykgCgpgYGAKCiMjIyMgUmVzdWx0czogTW9vZCB2cyBTdWJqZWN0aXZlIFN0cmVzc3stfQoKYGBge3J9CnRhYmxlLm1vb2Rfd2VlayA8LSB0YWJfbW9kZWwoZ2xtZXIucG9zbW9vZF93ZWVrLCBnbG1lci5uZWdtb29kX3dlZWssCiAgICAgICAgICB0ZXJtcz1jKCIoSW50ZXJjZXB0KSIsIldlZWtfVHlwZSBbU3RyZXNzXSIsICJTZXggW01hbGVdIiwgIlByb2dyYW0gW0JTY19NZWRdIiwgIkZpcnN0X1dlZWsgW0V4YW0tRmlyc3RdIiwgImFjY19kZWx0YSIsICJwaHlzaWNhbF9leGNlcmNpc2VfZHVyIiksIAogICAgICAgICAgZHYubGFiZWxzPWMoIlBvc2l0aXZlIiwgIk5lZ2F0aXZlIiksIAogICAgICAgICAgdGl0bGU9IlRhYmxlIDIuIE1vb2QgdnMgV2VlayBUeXBlIiwgCiAgICAgICAgICB0cmFuc2Zvcm09TlVMTCwgCiAgICAgICAgIHNob3cuc3RhdD1UUlVFLAogICAgICAgICBzaG93LnNlPVRSVUUpCmh0bWxUYWJsZTo6aHRtbFRhYmxlKHRhYmxlLm1vb2Rfd2VlayRrbml0cikKYGBgCgoKCiMjIyBQaHlpc2lvbG9neSBTdHJlc3MKCldlIGVzdGFibGlzaGVkIGNoYW5nZXMgaW4gc3ViamVjdGl2ZSBzdHJlc3MgYmV0d2VlbiB0aGUgd2Vla3MsIHdoaWNoIGhhcyBhbiBpbXBhY3Qgb24gb3VyIG1vb2Qgb3V0Y29tZXMuIFdlIGFsc28gd2FudCB0byBzZWUgaWYgdGhlcmUncyBhIGdlbmVyYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwaHlzaW9sb2d5IHZhcmlhYmxlcyBhbmQgdGhlIHdlZWtzLlRvIGRvIHRoaXMgd2UgYXBwbHkgdGhlIHNhbWUgYXBwcm9hY2ggZm9yIHRoZSBwaHlzaW9sb2d5IG1lYXN1cmVzIGFzIHRoZSBvdGhlciBtb2RlbHMuIFdlIGFsc28gYWRkIG1lYXN1cmVzIG9mIHNraW4gdGVtcGVyYXR1cmUgaGVyZSBob3dldmVyLCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBmYWN0b3IgdGhpcyBpbi4gU2tpbiB0ZW1wZXJhdHVyZSBpcyBpbXBvcnRhbnQgYXMgaXQgY2FuIGJlIHJlbGF0ZWQgdG8gc3dlYXQgb3IgaGVhdCwgd2hpY2ggY2FuIGFsc28gbGVhZCB0byBpbmNyZWFzZWQgYXJvdXNhbCBtZWFzdXJlcy4gCgojIyMjIFNraW4gQ29uZHVjdGFuY2Ugey50YWJzZXQgLnRhYnNldC1mYWRlfQoKRmlyc3Qgd2UgbW9kZWwgdGhlIHNraW4gY29uZHVjdGFuY2UsIGNvbnRyb2xsaW5nIGZvciBza2luIHRlbXBlcmF0dXJlIGFuZCBwaHlzaWNhbCBleGVyY2lzZS4KCiMjIyMjIFRvbmljIFNDIHstfSAKCmBgYHtyIHdhcm5pbmc9VFJVRX0KIyAjIE1vZGVsCiMgZ2xtZXIuc2NfdG9uX21lYW5fd2VlayA8LSBnbG1lciggc2NfdG9uaWNfbWVhbl9zIH4gV2Vla19UeXBlICsgCiMgICAgIFNleCArIFByb2dyYW0gKyAjIE1vZGVsIHBvcCBkaWZmZXJlbmNlcwojICAgICBGaXJzdF9XZWVrICsgIGVtYV9iZWVwX2YqZW1hX2RheSArICMgTW9kZWwgZGF5IHJlbGF0ZWQgZGlmZmVyZW5jeGVzCiMgICAgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEgKyAjIE1vZGxlIG1vdmVtZW50IHN0dWZmCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgICMgTW9kZWwgdGVtcCBlZmZlY3RzCiMgICAgICgxK1dlZWtfVHlwZSB8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMSB8IGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwgCiMgICAgIEVNQV9EYXRhLCAKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTEwMDAwMCkpKQoKIyBNb2RlbCBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5zY190b25fbWVhbl93ZWVrKQoKCmBgYAoKCiMjIyMjIFBoYXNpYyBOdW0gey19CgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIE1vZGVsCiMgZ2xtZXIuc2NfcGhfbnVtIDwtIGdsbWVyKCBzY19waGFzaWNfbnVtIH4gIFdlZWtfVHlwZSArIAojICAgICBTZXggKyBQcm9ncmFtICsgIyBNb2RlbCBwb3AgZGlmZmVyZW5jZXMKIyAgICAgRmlyc3RfV2VlayArICBlbWFfYmVlcF9mKmVtYV9kYXkgKyAjIE1vZGVsIGRheSByZWxhdGVkIGRpZmZlcmVuY3hlcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgYWNjX2RlbHRhICsgIyBNb2RsZSBtb3ZlbWVudCBzdHVmZgojICAgICB0ZW1wX21lYW5feiArIHRlbXBfc2xvcGVfeiArICAjIE1vZGVsIHRlbXAgZWZmZWN0cwojICAgICAoMStXZWVrX1R5cGUgfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDEgfCBjYXN0b3JfcmVjb3JkX2lkOmVtYV9kYXk6ZW1hX2JlZXBfZiksICAKIyAgICAgRU1BX0RhdGEsIAojICAgICBmYW1pbHk9cG9pc3NvbihsaW5rPSJsb2ciKSwKIyAgICAgY29udHJvbD1sbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnNjX3BoX251bSkKCmBgYAoKCgojIyMjIyBQaGFzaWMgTWFnbml0dWRlIHstfQpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIE1vZGVsCiMgZ2xtZXIuc2NfcGhfbWFnIDwtIGdsbWVyKCBzY19waGFzaWNfbWFnX3MgfiBXZWVrX1R5cGUgKyAKIyAgICAgU2V4ICsgUHJvZ3JhbSArICMgTW9kZWwgcG9wIGRpZmZlcmVuY2VzCiMgICAgIEZpcnN0X1dlZWsgKyAgZW1hX2JlZXBfZiplbWFfZGF5ICsgIyBNb2RlbCBkYXkgcmVsYXRlZCBkaWZmZXJlbmN4ZXMKIyAgICAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArYWNjX2RlbHRhICsgIyBNb2RsZSBtb3ZlbWVudCBzdHVmZgojICAgICB0ZW1wX21lYW5feiArIHRlbXBfc2xvcGVfeiArICAjIE1vZGVsIHRlbXAgZWZmZWN0cwojICAgICAoMStXZWVrX1R5cGUgfGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDEgfCBjYXN0b3JfcmVjb3JkX2lkOmVtYV9kYXk6ZW1hX2JlZXBfZiksIAojICAgICBFTUFfRGF0YSwgCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnNjX3BoX21hZykKCmBgYAoKCgojIyMjIyBQaGFzaWMgQVVDIHstfQoKYGBge3J9CiMgTW9kZWwKIyBnbG1lci5zY19waF9hdWNfd2VlayA8LSBnbG1lciggc2NfcGhhc2ljX2F1Y19zICB+IFdlZWtfVHlwZSArIAojICAgICBTZXggKyBQcm9ncmFtICsgIyBNb2RlbCBwb3AgZGlmZmVyZW5jZXMKIyAgICAgRmlyc3RfV2VlayArICBlbWFfYmVlcF9mKmVtYV9kYXkgKyAjIE1vZGVsIGRheSByZWxhdGVkIGRpZmZlcmVuY3hlcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICthY2NfZGVsdGEgKyAjIE1vZGxlIG1vdmVtZW50IHN0dWZmCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgICMgTW9kZWwgdGVtcCBlZmZlY3RzCiMgICAgICgxK1dlZWtfVHlwZSB8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMSB8IGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwgCiMgICAgIEVNQV9EYXRhLCAKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9bG9nKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSwgb3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApKSkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuc2NfcGhfYXVjX3dlZWspCgpgYGAgCgoKIyMjIyBIZWFydCBSYXRlIHsudGFic2V0fQoKTmV4dCBXZSBjaGVjayB0aGUgaGVhcnQgcmF0ZSBkYXRhLiBJdCBhZ2FpbiBsb29rcyBsaWtlIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIG1vZGVscyBpcyBub3QgYXMgZXhwZWN0ZWQuCgojIyMjIyBIUiBNZWFuIHstfQoKYGBge3J9CiMgTW9kZWwKIyBnbG1lci5ocl9tZWFuX3dlZWsgPC0gZ2xtZXIoIGhyX21lYW5fcyB+IFdlZWtfVHlwZSArIAojICAgICBTZXggKyBQcm9ncmFtICsgIyBNb2RlbCBwb3AgZGlmZmVyZW5jZXMKIyAgICAgRmlyc3RfV2VlayArICBlbWFfYmVlcF9mKmVtYV9kYXkgKyAjIE1vZGVsIGRheSByZWxhdGVkIGRpZmZlcmVuY3hlcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICthY2NfZGVsdGEgKyAjIE1vZGxlIG1vdmVtZW50IHN0dWZmCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgICMgTW9kZWwgdGVtcCBlZmZlY3RzCiMgICAgICgxK1dlZWtfVHlwZSB8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMSB8IGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwgCiMgICAgIEVNQV9EYXRhLCAKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9aWRlbnRpdHkpLAojICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UsIG9wdEN0cmw9bGlzdChtYXhmdW49MTAwMDAwKSkpCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLmhyX21lYW5fd2VlaykKCmBgYAoKCiMjIyMjIEhSIE1heCB7LX0KCmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuaHJfbWF4X3dlZWsgPC0gZ2xtZXIoIGhyX21heF9zICB+IFdlZWtfVHlwZSArIAojICAgICBTZXggKyBQcm9ncmFtICsgIyBNb2RlbCBwb3AgZGlmZmVyZW5jZXMKIyAgICAgRmlyc3RfV2VlayArICBlbWFfYmVlcF9mKmVtYV9kYXkgKyAjIE1vZGVsIGRheSByZWxhdGVkIGRpZmZlcmVuY3hlcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICthY2NfZGVsdGEgKyAjIE1vZGxlIG1vdmVtZW50IHN0dWZmCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgICMgTW9kZWwgdGVtcCBlZmZlY3RzCiMgICAgICgxK1dlZWtfVHlwZSB8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMSB8IGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwgIAojICAgICBFTUFfRGF0YSwgCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTEwMDAwMCkpKQoKIyBNb2RlbCBTVW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5ocl9tYXhfd2VlaykKCmBgYAoKCiMjIyMjIEhSIE1pbiB7LX0KCmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuaHJfbWluX3dlZWsgPC0gZ2xtZXIoIGhyX21pbl9zICB+IFdlZWtfVHlwZSArIAojICAgICBTZXggKyBQcm9ncmFtICsgIyBNb2RlbCBwb3AgZGlmZmVyZW5jZXMKIyAgICAgRmlyc3RfV2VlayArICBlbWFfYmVlcF9mKmVtYV9kYXkgKyAjIE1vZGVsIGRheSByZWxhdGVkIGRpZmZlcmVuY3hlcwojICAgICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICthY2NfZGVsdGEgKyAjIE1vZGxlIG1vdmVtZW50IHN0dWZmCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgICMgTW9kZWwgdGVtcCBlZmZlY3RzCiMgICAgICgxK1dlZWtfVHlwZSB8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSArICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMSB8IGNhc3Rvcl9yZWNvcmRfaWQ6ZW1hX2RheTplbWFfYmVlcF9mKSwgCiMgICAgIEVNQV9EYXRhLCAKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UsIG9wdEN0cmw9bGlzdChtYXhmdW49MTAwMDAwKSkpCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLmhyX21pbl93ZWVrKQoKYGBgCgoKCiMjIyMgUmVzdWx0czogUGh5c2lvbG9neSB2cyBXZWVrdHlwZQpXZSBub3cgcHJlc2VudCB0aGUgcGh5c2lvbG9neSByZXN1bHRzIGluIGEgdGFibGUsIGNvcnJlY3RlZCBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMgd2l0aCBGRFIuCmBgYHtyfQp0YWJsZS5waHlzaW9fd2VlayA8LSB0YWJfbW9kZWwoZ2xtZXIuc2NfdG9uX21lYW5fd2VlaywgZ2xtZXIuc2NfcGhfbnVtLCBnbG1lci5zY19waF9tYWcsIGdsbWVyLnNjX3BoX2F1Y193ZWVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICBnbG1lci5ocl9tZWFuX3dlZWssIGdsbWVyLmhyX21pbl93ZWVrLCBnbG1lci5ocl9tYXhfd2VlaywgCiAgICAgICAgIHRlcm1zPWMoIihJbnRlcmNlcHQpIiwiV2Vla19UeXBlIFtTdHJlc3NdIiwgIlNleCBbTWFsZV0iLCAiUHJvZ3JhbSBbQlNjX01lZF0iLCAiRmlyc3RfV2VlayBbRXhhbS1GaXJzdF0iLCAiYWNjX2RlbHRhIiwgInBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIiLCAKICAgICAgICAgInRlbXBfbWVhbl96IiwgInRlbXBfc2xvcGVfeiIpLCAKICAgICAgICAgIGR2LmxhYmVscz1jKCJUb25pYyIsICJOdW1iZXIiLCAiTWFnbml0dWRlIiwgIkFVQyIsICJNZWFuIiwgIk1pbiIsICJNYXgiKSwgCiAgICAgICAgICB0aXRsZT0iVGFibGUgMy4gUGh5c2lvIHZzIFdlZWsgVHlwZSIsIAogICAgICAgICAgdHJhbnNmb3JtPU5VTEwsIHAuYWRqdXN0PSJmZHIiLAogICAgICAgICBzaG93LnN0YXQ9VFJVRSwKICAgICAgICAgc2hvdy5zZT1UKSAKaHRtbFRhYmxlOjpodG1sVGFibGUodGFibGUucGh5c2lvX3dlZWska25pdHIpCmBgYAoKCgojIyMgUGxvdDogV2VlayB2IE91dGNvbWVzCkZpbmFsbHksIHdlIGNhbiBwbG90IHRoZSBlc3RpbWF0ZXMgZm9yIHRoZSB3ZWVrIGRpZmZlcmVuY2VzIGhlcmUsIGFsc28gY29ycmVjdGluZyBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMgd2l0aCBGRFIuCmBgYHtyfQojIFRvZ2V0aGVyCnBsb3QucGh5c2lvIDwtIHBsb3RfbW9kZWxzKGdsbWVyLnBvc21vb2Rfd2VlaywgZ2xtZXIuc2NfdG9uX21lYW5fd2VlaywgZ2xtZXIuc2NfcGhfbnVtKQpybV90ZXJtIDwtIGFzLnZlY3RvcihwbG90LnBoeXNpbyRkYXRhJHRlcm1bMTo5N10pCnJtX3Rlcm0gPC0gcm1fdGVybVtybV90ZXJtICE9ICJXZWVrX1R5cGVTdHJlc3MiXQojIENvbG9yIGxpc3QKY29sX2xpc3QgPC1jKCcjNzU3MEIzJywnIzc1NzBCMycsJyM3NTcwQjMnLCIjRDk1RjAyIiwgIiNEOTVGMDIiLCAnI0Q5NUYwMicsICcjRDk1RjAyJywgIiMxQjlFNzciLCAiIzFCOUU3NyIpCgojIE1ha2UgdGhlIHBsb3QKcGxvdC5hbGxfd2Vla19yZXNpZCA8LSBwbG90X21vZGVscyggZ2xtZXIucG9zbW9vZF93ZWVrLCBnbG1lci5uZWdtb29kX3dlZWssIAogICAgICAgICAgICBnbG1lci5zY190b25fbWVhbl93ZWVrLCBnbG1lci5zY19waF9udW0sIGdsbWVyLnNjX3BoX21hZywgZ2xtZXIuc2NfcGhfYXVjX3dlZWssIAogICAgICAgICAgICBnbG1lci5ocl9tZWFuX3dlZWssIGdsbWVyLmhyX21pbl93ZWVrLCBnbG1lci5ocl9tYXhfd2VlaywKICAgICAgICAgICAgbS5sYWJlbHM9YygiUG9zaXRpdmUgQWZmZWN0IiwgIk5lZ2F0aXZlIEFmZmVjdCIsICJTQyBUb25pYyIsICJTQyBOdW1iZXIiLCAiU0MgTWFnbml0dWVkIiwgIlNDIEFVQyIsIkhSIE1lYW4iLCAiSFIgTWluaW11bSIsICJIUiBNYXhpbXVtIiksCiAgICAgICAgICAgIGF4aXMubGFiZWxzID0gYygiICIpLAogICAgICAgICAgICAjIFN0YXN0aXN0aWNhbCBTdHVmZgogICAgICAgICAgICBybS50ZXJtcyA9IHJtX3Rlcm0sCiAgICAgICAgICAgICNzaG93LnZhbHVlcyA9IFQsCiAgICAgICAgICAgICN2YWx1ZS5zaXplID0gNCwgCiAgICAgICAgICAgICNzdGQuZXN0PVQsIAogICAgICAgICAgICBzaG93LnA9VCwKICAgICAgICAgICAgcC5zaGFwZT1ULAogICAgICAgICAgICBwLmFkanVzdCA9ICJmZHIiLCAKICAgICAgICAgICAgbGVnZW5kLnB2YWwudGl0bGUgPSAiU2lnbmlmaWNhbmNlIiwgCiAgICAgICAgICAgICMgVmlzdWFsIFN0dWZmCiAgICAgICAgICAgIGNvbG9ycz1jb2xfbGlzdCwKICAgICAgICAgICAgZG90LnNpemU9MiwKICAgICAgICAgICAgbGluZS5zaXplID0gMSwKICAgICAgICAgICAgc3BhY2luZz0wLjcsIAogICAgICAgICAgICB2bGluZS5jb2xvciA9ICJkYXJrZ3JleSIsIAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSAiIikgKyAKICAgICAgICAgICAgcHRoZW1lICsgCiAgICAgICAgICAgIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNiksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSxheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMSksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTk1IiksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTkwIikpIAoKIyBQbG90IGFuZCBzYXZlCnBsb3QuYWxsX3dlZWtfcmVzaWQgKyBjb29yZF9mbGlwKHlsaW09YygtMC41LDAuNSkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTUiKSwgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTAiKSkKZ2dzYXZlKCJmaWd1cmVzL2ZpZ19XZWVrUmVzaWRfQUxMLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD00LCBoZWlnaHQ9NCwgZHBpPTMwMCwgY29tcHJlc3Npb24gPSAnbHp3JywgYmc9InRyYW5zcGFyZW50IikKYGBgCgoKCiMjIE1vbWVudGFyeSBBc3NvY2lhdGlvbnMKCldlIHNhdyBsb3dlciBwaHlzaW9sb2dpY2FsIGFyb3VzYWwgaW4gdGhlIGV4YW0gd2Vlaywgd2hpY2ggd2FzIHVuZXhwZWN0ZWQuIFdlIGFsc28gc2VlIGxvd2VyIHBvc2l0aXZlIGFyb3VzYWwuIFNvIGl0IGNvdWxkIGJlIHRoYXQgdGhlIGVmZmVjdHMgd2Ugc2VlIGFyZSBhY3R1YWxseSBkcml2ZW4gYnkgb3VyIHBvc2l0aXZlIGFyb3VzYWwvbW9vZC4gVG8gY2hlY2sgdGhpcywgYW5kIHRvIGFsc28gY2hlY2sgd2hldGhlciB3ZSBjYW4gcmVwbGljYXRlIHByZXZpb3VzIGluZGluZ3Mgb24gbW9tZW50LXRvLW1vbWVudCBhc3NvY2lhdGlvbnMgYmV0d2VlbiBzdWJqZWN0aXZlIHN0cmVzcyBhbmQgcGh5c2lvbG9naWNhbCBhcm91c2FsIGFuZCBtb29kLCB3ZSBkaXNjYXJkIHdlZWsgdHlwZSwgYW5kIGxvb2sgYXQgdGhlIG1lYXN1cmUgY29udGludW91c2x5LiAKCkluIHRoaXMgbW9kZWxzLCB3ZSB1c2UgYSBmaXhlZCBzbG9wZSBkdWUgdG8gY29udmVyZ2VuY2UgaXNzdWVzLiBXZSBpbml0aWFsbHkgdHJpZWQgY2hhbmdpbmcgb3B0aW1pemVycywgd2hpY2ggZGlkIG5vdCByZXN1bHQgaW4gYmV0dGVyIGNvbnZlcmdlbmNlLCBzbyB3ZSBzaW1wbGlmaWVkIHRoZSBtb2RlbCBieSBkb2luZyBhIGZpeGVkIHNsb3BlIGZvciBvdXIgZml4ZWQgZWZmZWN0IG9mIGludGVyZXN0LiBXZSBhZ2FpbiB1c2UgbW9yZSBvciBsZXNzIHRoZSBzYW1lIGNvdmFyaWF0ZXMgYXMgYmVmb3JlLCBleGNlcHQgZm9yIHByb2dyYW0sIGFuZCBmb3IgZGF5LiBXZSBrZWVwIHRoZSB0aW1lIHZhcmlhYmxlIGluIHRoZXJlIHRvIGNvbnRyb2wgZm9yIGNpcmNhZGlhbiByaHl0aG1zLiBBZGRpdGlvbmFsbHksIHdlIHNlZSB0aGVyZSBpcyBhIGNvcnJlbGF0aW9uIGJldHdlZW4gb3VyIHN1YmplY3RpdmUgc3RyZXNzIG1lYXN1cmVzLCBzbyB3ZSBuZWVkIHRvIGZhY3RvciB0aGlzIGVmZmVjdCBpbiBieSBtb2RlbGluZyBpbnRlcmFjdGlvbiB0ZXJtcyBhcyB3ZWxsLiAKCmBgYHtyfQogcmNvcnIoYXMubWF0cml4KEVNQV9EYXRhWyxjKCJldmVudF90b3RfcyIsICJhY3Rpdml0eV90b3RfcyIsICJzb2NpYWxfdG90X3MiLCAicGh5c2ljYWxfdG90X3MiKV0pKQpgYGAKCiMjIyBNb29kIHsudGFic2V0fQoKRmlyc3Qgd2UgY2hlY2sgdGhlIG1vbWVudC10by1tb21lbnQgYXNzb2NpYXRpb25zIGJldHdlZW4gcG9zaXRpdmUgYWZmZWN0IGFuZCBzdWJqZWN0aXZlIHN0cmVzcy4gVGhlc2UgY29uZmlybSB0aGF0IG1vbWVudGFyeSBzdWJqZWN0aXZlIHN0cmVzcyBpcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCByZWR1Y2VkIHBvc2l0aXZlIGFmZmVjdCwgYW5kIGluY3JlYXNlZCBuZWdhdGl2ZSBhZmZlY3QuCgojIyMjIFBvc2l0aXZlIHstfQpgYGB7cn0KCiMgZ2xtZXIucG9zbW9vZF9iZWVwIDwtIGxtZXIobW9vZF9wb3NpdGl2ZV9zIH4gCiMgICAgIGV2ZW50X3RvdF9zKmFjdGl2aXR5X3RvdF9zICsgYWN0aXZpdHlfdG90X3Mqc29jaWFsX3RvdF9zICsgcGh5c2ljYWxfdG90X3MgKwojICAgICBlbWFfYmVlcCArICMgSSB3aWxsIG1vZGVsIHRoZSBiZWVwIHRvIGZhY3RvciBjaXJjYWRpYW4gcmh5dGhtcwojICAgICBTZXggKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSArCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgCiMgICAgICgwK2V2ZW50X3RvdF9zK2FjdGl2aXR5X3RvdF9zK3NvY2lhbF90b3RfcytwaHlzaWNhbF90b3RfcyB8IGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIyBmYW1pbHk9Z2F1c3NpYW4obGluaz0iaWRlbnRpdHkiKSwKIyAgICAgY29udHJvbD1sbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnBvc21vb2RfYmVlcCApCgpgYGAKCiMjIyMgTmVnYXRpdmUgey19CgpgYGB7cn0KIyBnbG1lci5uZWdtb29kX2JlZXAgPC0gZ2xtZXIobW9vZF9uZWdhdGl2ZV9zIH4gCiMgICAgIGV2ZW50X3RvdF9zKmFjdGl2aXR5X3RvdF9zICsgYWN0aXZpdHlfdG90X3Mqc29jaWFsX3RvdF9zICsgcGh5c2ljYWxfdG90X3MgKwojICAgICBlbWFfYmVlcCArICMgSSB3aWxsIG1vZGVsIHRoZSBiZWVwIHRvIGZhY3RvciBjaXJjYWRpYW4gcmh5dGhtcwojICAgICBTZXggKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSArCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgCiMgICAgICgwK2V2ZW50X3RvdF9zK2FjdGl2aXR5X3RvdF9zK3NvY2lhbF90b3RfcytwaHlzaWNhbF90b3RfcyB8IGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLm5lZ21vb2RfYmVlcCkKYGBgCgojIyMjIFRhYmxlOiBNb29kIHBlciBCZWVwIHstfQpgYGB7cn0KdGFibGUubW9vZF9iZWVwIDwtIHRhYl9tb2RlbChnbG1lci5wb3Ntb29kX2JlZXAsIGdsbWVyLm5lZ21vb2RfYmVlcCwKICAgICAgICAgIyB0ZXJtcz1jKCIoSW50ZXJjZXB0KSIsIldlZWtfVHlwZSBbU3RyZXNzXSIsICJTZXggW01hbGVdIiwgIlByb2dyYW0gW0JTY19NZWRdIiwgIkZpcnN0X1dlZWsgW0V4YW0tRmlyc3RdIiwgImFjY19kZWx0YSIsICJwaHlzaWNhbF9leGNlcmNpc2VfZHVyIiksIAogICAgICAgICAgdGl0bGU9IlRhYmxlIDMuIEhSIHZzIFdlZWsgVHlwZSIsIAogICAgICAgICAgdHJhbnNmb3JtPU5VTEwsIHAuYWRqdXN0ID0gImZkciIsCiAgICAgICAgIHNob3cuc3RhdD1UUlVFLAogICAgICAgICBzaG93LnNlPVRSVUUpIApodG1sVGFibGU6Omh0bWxUYWJsZSh0YWJsZS5tb29kX2JlZXAka25pdHIpCmBgYAoKCgojIyMgU2tpbiBjb25kdWN0YW5jZSB7LnRhYnNldH0KCldlIG5leHQgbW9kZWwgdGhlIHNraW4gY29uZHVjdGFuY2UgdnMuIHRoZSBzdWJqZWN0aXZlIHN0cmVzcyBtZWFzdXJlcy4gV2UgZXhwZWN0IHRoYXQgY29udGludW91cyBhbmFseXNpcyB3aWxsIHJlc3VsdCBpbiBhIHJlcGxpY2F0aW9uIG9mIHByZXZpb3VzIGZpbmRpbmdzIHdoZXJlIG1vbWVudGFyeSBzdHJlc3MgaXMgaW5kZWVkIGFzc29jaWF0ZWQgd2l0aCBpbmNyZWFzZSBwaHlzaW9sb2dpY2FsIGFyb3VzYWwuIE91ciBmaW5kaW5ncyBhcmUgaW5kZWVkIHNob3duIGluIFtUYWJsZTogU3ViamVjdGl2ZSBTdHJlc3MgYW5kIE91dGNvbWVzXS4KCiMjIyMgVG9uaWMgTWVhbiB7LX0KCmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuc2NfdG9uX2VtYSA8LSBnbG1lcihzY190b25pY19tZWFuX3MgfiAKIyAgICAgZXZlbnRfdG90X3MqYWN0aXZpdHlfdG90X3MgKyBhY3Rpdml0eV90b3Rfcypzb2NpYWxfdG90X3MgKyBwaHlzaWNhbF90b3RfcyArCiMgICAgIGVtYV9iZWVwICsgIyBJIHdpbGwgbW9kZWwgdGhlIGJlZXAgdG8gZmFjdG9yIGNpcmNhZGlhbiByaHl0aG1zCiMgICAgIFNleCArICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgYWNjX2RlbHRhICsKIyAgICAgdGVtcF9tZWFuX3ogKyB0ZW1wX3Nsb3BlX3ogKyAKIyAgICAgKDArZXZlbnRfdG90X3MrYWN0aXZpdHlfdG90X3Mrc29jaWFsX3RvdF9zK3BoeXNpY2FsX3RvdF9zIHwgY2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnNjX3Rvbl9lbWEpCmBgYAoKCiMjIyMgUGhhc2ljIE51bWJlciB7LX0KYGBge3J9CiMgTW9kZWwKIyBnbG1lci5zY19waF9udW1fZW1hIDwtIGdsbWVyKHNjX3BoYXNpY19udW0gIH4gCiMgICAgIGV2ZW50X3RvdF9zKmFjdGl2aXR5X3RvdF9zICsgYWN0aXZpdHlfdG90X3Mqc29jaWFsX3RvdF9zICsgcGh5c2ljYWxfdG90X3MgKwojICAgICBlbWFfYmVlcCArICMgSSB3aWxsIG1vZGVsIHRoZSBiZWVwIHRvIGZhY3RvciBjaXJjYWRpYW4gcmh5dGhtcwojICAgICBTZXggKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSArCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgCiMgICAgICgwK2V2ZW50X3RvdF9zK2FjdGl2aXR5X3RvdF9zK3NvY2lhbF90b3RfcytwaHlzaWNhbF90b3RfcyB8IGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIGZhbWlseT1wb2lzc29uKGxpbms9InNxcnQiKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSkgKQoKIyBNb2RlbCBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5zY19waF9udW1fZW1hKQpgYGAKCgojIyMjIFBoYXNpYyBNYWduaXR1ZGUgey19CgpgYGB7cn0KIyBNb2RlbAojIGdsbWVyLnNjX3BoX21hZ19lbWEgPC0gZ2xtZXIoc2NfcGhhc2ljX21hZ19zICAgfgojICAgICBldmVudF90b3RfcyphY3Rpdml0eV90b3RfcyArIGFjdGl2aXR5X3RvdF9zKnNvY2lhbF90b3RfcyArIHBoeXNpY2FsX3RvdF9zICsKIyAgICAgZW1hX2JlZXAgKyAjIEkgd2lsbCBtb2RlbCB0aGUgYmVlcCB0byBmYWN0b3IgY2lyY2FkaWFuIHJoeXRobXMKIyAgICAgU2V4ICsgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEgKwojICAgICB0ZW1wX21lYW5feiArIHRlbXBfc2xvcGVfeiArIAojICAgICAoMCtldmVudF90b3RfcythY3Rpdml0eV90b3Rfcytzb2NpYWxfdG90X3MrcGh5c2ljYWxfdG90X3MgfCBjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMCtlbWFfYmVlcHxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCksCiMgICAgIEVNQV9EYXRhLAojICAgICBmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSwgb3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApKSkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuc2NfcGhfbWFnX2VtYSkKYGBgCgoKIyMjIyBQaGFzaWMgQVVDIHstfQoKYGBge3J9CiMgTW9kZWwKIyBnbG1lci5zY19waF9hdWNfZW1hIDwtIGdsbWVyKHNjX3BoYXNpY19hdWNfcyAgfgojICAgICAgZXZlbnRfdG90X3MqYWN0aXZpdHlfdG90X3MgKyBhY3Rpdml0eV90b3Rfcypzb2NpYWxfdG90X3MgKyBwaHlzaWNhbF90b3RfcyArCiMgICAgIGVtYV9iZWVwICsgIyBJIHdpbGwgbW9kZWwgdGhlIGJlZXAgdG8gZmFjdG9yIGNpcmNhZGlhbiByaHl0aG1zCiMgICAgIFNleCArICBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsgYWNjX2RlbHRhICsKIyAgICAgdGVtcF9tZWFuX3ogKyB0ZW1wX3Nsb3BlX3ogKyAKIyAgICAgKDArZXZlbnRfdG90X3MrYWN0aXZpdHlfdG90X3Mrc29jaWFsX3RvdF9zK3BoeXNpY2FsX3RvdF9zIHwgY2FzdG9yX3JlY29yZF9pZCkgKyAKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpICkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuc2NfcGhfYXVjX2VtYSkKYGBgCgoKIyMjIEhlYXJ0IFJhdGV7LnRhYnNldH0KCkZpbmFsbHksIHdlIGFsc28gdGFrZSBhIGxvb2sgYXQgc3ViamVjdGl2ZSBzdHJlc3MgYXNzb2NpYXRpb25zIHdpdGggc3ViamVjdGl2ZSBzdHJlc3MuIEhlcmUgd2UgZG8gbm90IHNlZSBhbnkgc3RyaWtpbmcgcmVsYXRpb25zaGlwcy4gCgojIyMjIE1lYW4gey19CgpgYGB7cn0KIyBNb2RlbAojIGdsbWVyLmhyX21lYW5fZW1hIDwtIGdsbWVyKGhyX21lYW5fcyB+CiMgICAgIGV2ZW50X3RvdF9zKmFjdGl2aXR5X3RvdF9zICsgYWN0aXZpdHlfdG90X3Mqc29jaWFsX3RvdF9zICsgcGh5c2ljYWxfdG90X3MgKwojICAgICBlbWFfYmVlcCArICMgSSB3aWxsIG1vZGVsIHRoZSBiZWVwIHRvIGZhY3RvciBjaXJjYWRpYW4gcmh5dGhtcwojICAgICBTZXggKyAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArIGFjY19kZWx0YSArCiMgICAgIHRlbXBfbWVhbl96ICsgdGVtcF9zbG9wZV96ICsgCiMgICAgICgwK2V2ZW50X3RvdF9zK2FjdGl2aXR5X3RvdF9zK3NvY2lhbF90b3RfcytwaHlzaWNhbF90b3RfcyB8IGNhc3Rvcl9yZWNvcmRfaWQpICsgCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLAojICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UsIG9wdEN0cmw9bGlzdChtYXhmdW49MTAwMDAwKSkpCgojIE1vZGVsIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLmhyX21lYW5fZW1hKQpgYGAKCgojIyMjIE1pbiB7LX0KCmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuaHJfbWluX2VtYSA8LSBnbG1lcihocl9taW5fcyAgfgojICAgICBldmVudF90b3RfcyphY3Rpdml0eV90b3RfcyArIGFjdGl2aXR5X3RvdF9zKnNvY2lhbF90b3RfcyArIHBoeXNpY2FsX3RvdF9zICsKIyAgICAgZW1hX2JlZXAgKyAjIEkgd2lsbCBtb2RlbCB0aGUgYmVlcCB0byBmYWN0b3IgY2lyY2FkaWFuIHJoeXRobXMKIyAgICAgU2V4ICsgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEgKwojICAgICB0ZW1wX21lYW5feiArIHRlbXBfc2xvcGVfeiArIAojICAgICAoMCtldmVudF90b3RfcythY3Rpdml0eV90b3Rfcytzb2NpYWxfdG90X3MrcGh5c2ljYWxfdG90X3MgfCBjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMCtlbWFfYmVlcHxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCksCiMgICAgIEVNQV9EYXRhLAojICAgICBmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpICkKCiMgTW9kZWwgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuaHJfbWluX2VtYSkKYGBgCgoKIyMjIyBNYXggey19CgpgYGB7cn0KIyBNb2RlbAojIGdsbWVyLmhyX21heF9lbWEgPC0gZ2xtZXIoaHJfbWF4X3MgfgojICAgICBldmVudF90b3RfcyphY3Rpdml0eV90b3RfcyArIGFjdGl2aXR5X3RvdF9zKnNvY2lhbF90b3RfcyArIHBoeXNpY2FsX3RvdF9zICsKIyAgICAgZW1hX2JlZXAgKyAjIEkgd2lsbCBtb2RlbCB0aGUgYmVlcCB0byBmYWN0b3IgY2lyY2FkaWFuIHJoeXRobXMKIyAgICAgU2V4ICsgIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKyBhY2NfZGVsdGEgKwojICAgICB0ZW1wX21lYW5feiArIHRlbXBfc2xvcGVfeiArIAojICAgICAoMCtldmVudF90b3RfcythY3Rpdml0eV90b3Rfcytzb2NpYWxfdG90X3MrcGh5c2ljYWxfdG90X3MgfCBjYXN0b3JfcmVjb3JkX2lkKSArIAojICAgICAoMCtlbWFfYmVlcHxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCksCiMgICAgIEVNQV9EYXRhLAojICAgICBmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSkgKQoKIyBNb2RlbCBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5ocl9tYXhfZW1hKQoKYGBgCgoKCiMjIyBUYWJsZTogU3ViamVjdGl2ZSBTdHJlc3MgYW5kIE91dGNvbWVzCgpgYGB7cn0KdGFibGUucGh5c2lvX2JlZXAgPC0gdGFiX21vZGVsKGdsbWVyLnNjX3Rvbl9lbWEsIGdsbWVyLnNjX3BoX251bV9lbWEsIGdsbWVyLnNjX3BoX21hZ19lbWEsIGdsbWVyLnNjX3BoX2F1Y19lbWEsIAogICAgICAgICAgICBnbG1lci5ocl9tZWFuX2VtYSwgZ2xtZXIuaHJfbWluX2VtYSwgZ2xtZXIuaHJfbWF4X2VtYSwgCiAgICAgICAgICBkdi5sYWJlbHM9YygiU0MgVG9uaWMiLCAiU0MgTnVtYmVyIiwgIlNDIE1hZ25pdHVkZSIsICJTQyBBVUMiLCAiTWVhbiIsICJNaW4iLCAiTWF4IiksIAogICAgICAgICAgdGl0bGU9IlRhYmxlIFguIE1vbWVudGFyeSBQaHlzaW9sb2d5IGFuZCBTdWJqZWN0aXZlIFN0cmVzcyIsCiAgICAgICAgICAgIHRyYW5zZm9ybT1OVUxMLCBwLmFkanVzdD0iZmRyIiwgCiAgICAgICAgIHNob3cuc3RhdD1UUlVFLAogICAgICAgICBzaG93LnNlPVRSVUUpIApodG1sVGFibGU6Omh0bWxUYWJsZSh0YWJsZS5waHlzaW9fYmVlcCRrbml0cikKYGBgCgojIyMgUGxvdDogT3V0Y29tZXMgdiBTdWJqZWN0aXZlIFN0cmVzcwoKTmV4dCBJIHdhbnQgdG8gcGxvdCBvdXIgb3V0Y29tZXMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgc3ViamVjdGl2ZSBzdHJlc3MuIEkgd2lsbCBkbyB0aGlzIGluIHNlcGFyYXRlIGdyYXBocyBmb3IgZXZlbnQsIGFjdGl2aXR5LCBzb2NpYWwsIGFuZCBwaHlzaWNhbCBzdHJlc3MuIFRoaXMgZ2V0cyBhIGxpdHRsZSBjb21wbGljYXRlZCB0aG91Z2guIFNvIEkgd2lsbCBtYWtlIGVhY2ggZ3JhcGggc2VwYXJhdGVseSwgYW5kIHRoZW4gY29tYmluZSB0aGVtIG91dHNpZGUgb2YgUiB0byBtYWtlIHN1cmUgdGhleSBzdGlsbCBsb29rIGdvb2QuIApgYGB7cn0KIyBTaG9ycnRsaXN0IHRoZSB2YXJpYWJsZXMgdG8gdGhvc2Ugb2YgaW50ZXJlc3QKcGxvdC52YXJzIDwtIHBsb3RfbW9kZWxzKGdsbWVyLnBvc21vb2RfYmVlcCwgZ2xtZXIuc2NfcGhfbnVtX2VtYSwgZ2xtZXIuaHJfbWVhbl9lbWEsIGdsbWVyLmhyX21pbl9lbWEsIGdsbWVyLmhyX21heF9lbWEpCiMgR2V0IGFuZCBmaWx0ZXIgdGVybXMKZnVsbF90ZXJtIDwtIGFzLnZlY3RvcihwbG90LnZhcnMkZGF0YSR0ZXJtWzE6bGVuZ3RoKHBsb3QudmFycyRkYXRhJHRlcm0pXSkKZXZlbnRfdGVybSA8LSBmdWxsX3Rlcm1bZnVsbF90ZXJtICE9ICJldmVudF90b3RfcyJdCmFjdGl2X3Rlcm0gPC1mdWxsX3Rlcm1bZnVsbF90ZXJtICE9ICJhY3Rpdml0eV90b3RfcyJdCnNvY190ZXJtIDwtIGZ1bGxfdGVybVtmdWxsX3Rlcm0gIT0gInNvY2lhbF90b3RfcyJdCnBoeV90ZXJtIDwtIGZ1bGxfdGVybVtmdWxsX3Rlcm0gIT0gInBoeXNpY2FsX3RvdF9zIl0KIyBTZXQgdGhlIGNvbG91cnMKY29sX2xpc3QgPC1jKCcjNzU3MEIzJywnIzc1NzBCMycsJyM3NTcwQjMnLCIjRDk1RjAyIiwgIiNEOTVGMDIiLCAnI0Q5NUYwMicsICcjRDk1RjAyJywgIiMxQjlFNzciLCAiIzFCOUU3NyIpCgojIEV2ZW50IFBsb3QKcGxvdC5ldmVudF9zdWJzdHIgPC0gcGxvdF9tb2RlbHMoZ2xtZXIucG9zbW9vZF9iZWVwLCBnbG1lci5uZWdtb29kX2JlZXAsIAogICAgICAgICAgICBnbG1lci5zY190b25fZW1hLCBnbG1lci5zY19waF9udW1fZW1hLCBnbG1lci5zY19waF9tYWdfZW1hLCBnbG1lci5zY19waF9hdWNfZW1hLCAKICAgICAgICAgICAgZ2xtZXIuaHJfbWVhbl9lbWEsIGdsbWVyLmhyX21pbl9lbWEsIGdsbWVyLmhyX21heF9lbWEsIAogICAgICAgICAgICBtLmxhYmVscz1jKCJQb3NpdGl2ZSBBZmZlY3QiLCAiTmVnYXRpdmUgQWZmZWN0IiwgIlNDIFRvbmljIiwgIlNDIE51bWJlciIsICJTQyBNYWduaXR1ZWQiLCAiU0MgQVVDIiwgIkhSIE1lYW4iLCAiSFIgTWluaW11bSIsICJIUiBNYXhpbXVtIiksCiAgICAgICAgICAgIGF4aXMubGFiZWxzID0gYygiIiksIAogICAgICAgICAgICAjIFN0YXN0aXN0aWNhbCBTdHVmZgogICAgICAgICAgICBybS50ZXJtcyA9IGV2ZW50X3Rlcm0sCiAgICAgICAgICAgICNzaG93LnZhbHVlcyA9IFQsCiAgICAgICAgICAgICN2YWx1ZS5zaXplID0gNCwgCiAgICAgICAgICAgICNzdGQuZXN0PVQsIAogICAgICAgICAgICBzaG93LnA9VCwKICAgICAgICAgICAgcC5zaGFwZT1ULAogICAgICAgICAgICBwLmFkanVzdCA9ICJmZHIiLCAKICAgICAgICAgICAgbGVnZW5kLnB2YWwudGl0bGUgPSAiU2lnbmlmaWNhbmNlIiwgCiAgICAgICAgICAgICMgVmlzdWFsIFN0dWZmCiAgICAgICAgICAgIGNvbG9ycz1jb2xfbGlzdCwKICAgICAgICAgICAgZG90LnNpemU9MiwKICAgICAgICAgICAgbGluZS5zaXplID0gMC41LAogICAgICAgICAgICBzcGFjaW5nPTAuNywgCiAgICAgICAgICAgIHZsaW5lLmNvbG9yID0gImRhcmtncmV5IiwgCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9ICIiKSArIAogICAgICAgICAgICBwdGhlbWUgKyAKICAgICAgICAgICAgdGhlbWUoYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTEpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5NSIpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5MCIpKSAKcGxvdC5ldmVudF9zdWJzdHIgPC0gcGxvdC5ldmVudF9zdWJzdHIrIGNvb3JkX2ZsaXAoeWxpbT1jKDAuNzUsMS4yNSkpICsgIGNvb3JkX2ZsaXAoeWxpbT1jKC0wLjUsMC41KSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKZ2dzYXZlKCJmaWd1cmVzL2ZpZ19TdHJSZXNpZF9FdmVudC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NCwgaGVpZ2h0PTQsIGRwaT0zMDAsIGNvbXByZXNzaW9uID0gJ2x6dycsIGJnPSJ0cmFuc3BhcmVudCIpCgojIEFjdCBQbG90CnBsb3QuYWN0aXZpdHlfc3Vic3RyIDwtICBwbG90X21vZGVscyhnbG1lci5wb3Ntb29kX2JlZXAsIGdsbWVyLm5lZ21vb2RfYmVlcCwgCiAgICAgICAgICAgIGdsbWVyLnNjX3Rvbl9lbWEsIGdsbWVyLnNjX3BoX251bV9lbWEsIGdsbWVyLnNjX3BoX21hZ19lbWEsIGdsbWVyLnNjX3BoX2F1Y19lbWEsIAogICAgICAgICAgICBnbG1lci5ocl9tZWFuX2VtYSwgZ2xtZXIuaHJfbWluX2VtYSwgZ2xtZXIuaHJfbWF4X2VtYSwgCiAgICAgICAgICAgIG0ubGFiZWxzPWMoIlBvc2l0aXZlIEFmZmVjdCIsICJOZWdhdGl2ZSBBZmZlY3QiLCAiU0MgVG9uaWMiLCAiU0MgTnVtYmVyIiwgIlNDIE1hZ25pdHVlZCIsICJTQyBBVUMiLCAiSFIgTWVhbiIsICJIUiBNaW5pbXVtIiwgIkhSIE1heGltdW0iKSwKICAgICAgICAgICAgYXhpcy5sYWJlbHMgPSBjKCIiKSwgCiAgICAgICAgICAgICMgU3Rhc3Rpc3RpY2FsIFN0dWZmCiAgICAgICAgICAgIHJtLnRlcm1zID0gYWN0aXZfdGVybSwKICAgICAgICAgICAgI3Nob3cudmFsdWVzID0gVCwKICAgICAgICAgICAgI3ZhbHVlLnNpemUgPSA0LCAKICAgICAgICAgICAgI3N0ZC5lc3Q9VCwgCiAgICAgICAgICAgIHNob3cucD1ULAogICAgICAgICAgICBwLnNoYXBlPVQsCiAgICAgICAgICAgIHAuYWRqdXN0ID0gImZkciIsIAogICAgICAgICAgICBsZWdlbmQucHZhbC50aXRsZSA9ICJTaWduaWZpY2FuY2UiLCAKICAgICAgICAgICAgIyBWaXN1YWwgU3R1ZmYKICAgICAgICAgICAgY29sb3JzPWNvbF9saXN0LAogICAgICAgICAgICBkb3Quc2l6ZT0yLAogICAgICAgICAgICBsaW5lLnNpemUgPSAwLjUsCiAgICAgICAgICAgIHNwYWNpbmc9MC43LCAKICAgICAgICAgICAgdmxpbmUuY29sb3IgPSAiZGFya2dyZXkiLCAKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIiIpICsgCiAgICAgICAgICAgIHB0aGVtZSArIAogICAgICAgICAgICAgIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTExKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTUiKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTAiKSkgCnBsb3QuYWN0aXZpdHlfc3Vic3RyIDwtIHBsb3QuYWN0aXZpdHlfc3Vic3RyKyBjb29yZF9mbGlwKHlsaW09YygwLjc1LDEuMjUpKSArICBjb29yZF9mbGlwKHlsaW09YygtMC41LDAuNSkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmdnc2F2ZSgiZmlndXJlcy9maWdfU3RyUmVzaWRfQWN0aXZpdHkudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQsIGhlaWdodD00LCBkcGk9MzAwLCBjb21wcmVzc2lvbiA9ICdsencnLCBiZz0idHJhbnNwYXJlbnQiKQoKCiMgU29jaWFsIFN0cmVzcwpwbG90LnNvY2lhbF9zdWJzdHIgPC0gIHBsb3RfbW9kZWxzKGdsbWVyLnBvc21vb2RfYmVlcCwgZ2xtZXIubmVnbW9vZF9iZWVwLCAKICAgICAgICAgICAgZ2xtZXIuc2NfdG9uX2VtYSwgZ2xtZXIuc2NfcGhfbnVtX2VtYSwgZ2xtZXIuc2NfcGhfbWFnX2VtYSwgZ2xtZXIuc2NfcGhfYXVjX2VtYSwgCiAgICAgICAgICAgIGdsbWVyLmhyX21lYW5fZW1hLCBnbG1lci5ocl9taW5fZW1hLCBnbG1lci5ocl9tYXhfZW1hLCAKICAgICAgICAgICAgbS5sYWJlbHM9YygiUG9zaXRpdmUgQWZmZWN0IiwgIk5lZ2F0aXZlIEFmZmVjdCIsICJTQyBUb25pYyIsICJTQyBOdW1iZXIiLCAiU0MgTWFnbml0dWVkIiwgIlNDIEFVQyIsICJIUiBNZWFuIiwgIkhSIE1pbmltdW0iLCAiSFIgTWF4aW11bSIpLAogICAgICAgICAgICBheGlzLmxhYmVscyA9IGMoIiIpLCAKICAgICAgICAgICAgIyBTdGFzdGlzdGljYWwgU3R1ZmYKICAgICAgICAgICAgcm0udGVybXMgPSBzb2NfdGVybSwKICAgICAgICAgICAgI3Nob3cudmFsdWVzID0gVCwKICAgICAgICAgICAgI3ZhbHVlLnNpemUgPSA0LCAKICAgICAgICAgICAgI3N0ZC5lc3Q9VCwgCiAgICAgICAgICAgIHNob3cucD1ULAogICAgICAgICAgICBwLnNoYXBlPVQsCiAgICAgICAgICAgIHAuYWRqdXN0ID0gImZkciIsIAogICAgICAgICAgICBsZWdlbmQucHZhbC50aXRsZSA9ICJTaWduaWZpY2FuY2UiLCAKICAgICAgICAgICAgIyBWaXN1YWwgU3R1ZmYKICAgICAgICAgICAgY29sb3JzPWNvbF9saXN0LAogICAgICAgICAgICBkb3Quc2l6ZT0yLAogICAgICAgICAgICBsaW5lLnNpemUgPSAwLjUsCiAgICAgICAgICAgIHNwYWNpbmc9MC43LCAKICAgICAgICAgICAgdmxpbmUuY29sb3IgPSAiZGFya2dyZXkiLCAKICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIiIpICsgCiAgICAgICAgICAgIHB0aGVtZSArIAogICAgICAgICAgICB0aGVtZShheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE2KSxheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMSksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTk1IiksCiAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTkwIikpIAojIyBQbG90CnBsb3Quc29jaWFsX3N1YnN0ciA8LSBwbG90LnNvY2lhbF9zdWJzdHIgKyBjb29yZF9mbGlwKHlsaW09YygwLjc1LDEuMjUpKSArICBjb29yZF9mbGlwKHlsaW09YygtMC41LDAuNSkpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmdnc2F2ZSgiZmlndXJlcy9maWdfU3RyUmVzaWRfU29jaWFsLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD00LCBoZWlnaHQ9NCwgZHBpPTMwMCwgY29tcHJlc3Npb24gPSAnbHp3JywgYmc9InRyYW5zcGFyZW50IikKCiMgUGh5c2ljYWwgU3RyZXNzCnBsb3QucGh5c2ljYWxfc3Vic3RyIDwtIHBsb3RfbW9kZWxzKGdsbWVyLnBvc21vb2RfYmVlcCwgZ2xtZXIubmVnbW9vZF9iZWVwLCAKICAgICAgICAgICAgZ2xtZXIuc2NfdG9uX2VtYSwgZ2xtZXIuc2NfcGhfbnVtX2VtYSwgZ2xtZXIuc2NfcGhfbWFnX2VtYSwgZ2xtZXIuc2NfcGhfYXVjX2VtYSwgCiAgICAgICAgICAgIGdsbWVyLmhyX21lYW5fZW1hLCBnbG1lci5ocl9taW5fZW1hLCBnbG1lci5ocl9tYXhfZW1hLCAKICAgICAgICAgICAgbS5sYWJlbHM9YygiUG9zaXRpdmUgQWZmZWN0IiwgIk5lZ2F0aXZlIEFmZmVjdCIsICJTQyBUb25pYyIsICJTQyBOdW1iZXIiLCAiU0MgTWFnbml0dWVkIiwgIlNDIEFVQyIsICJIUiBNZWFuIiwgIkhSIE1pbmltdW0iLCAiSFIgTWF4aW11bSIpLAogICAgICAgICAgICBheGlzLmxhYmVscyA9IGMoIiIpLCAKICAgICAgICAgICAgIyBTdGFzdGlzdGljYWwgU3R1ZmYKICAgICAgICAgICAgcm0udGVybXMgPSBwaHlfdGVybSwKICAgICAgICAgICAgI3Nob3cudmFsdWVzID0gVCwKICAgICAgICAgICAgI3ZhbHVlLnNpemUgPSA0LCAKICAgICAgICAgICAgI3N0ZC5lc3Q9VCwgCiAgICAgICAgICAgIHNob3cucD1ULAogICAgICAgICAgICBwLnNoYXBlPVQsCiAgICAgICAgICAgIHAuYWRqdXN0ID0gImZkciIsIAogICAgICAgICAgICBsZWdlbmQucHZhbC50aXRsZSA9ICJTaWduaWZpY2FuY2UiLCAKICAgICAgICAgICAgIyBWaXN1YWwgU3R1ZmYKICAgICAgICAgICAgY29sb3JzPWNvbF9saXN0LAogICAgICAgICAgICBkb3Quc2l6ZT0yLAogICAgICAgICAgICBsaW5lLnNpemUgPTAuNSwKICAgICAgICAgICAgc3BhY2luZz0wLjcsIAogICAgICAgICAgICB2bGluZS5jb2xvciA9ICJkYXJrZ3JleSIsIAogICAgICAgICAgICBsZWdlbmQudGl0bGUgPSAiIikgKyAKICAgICAgICAgICAgcHRoZW1lICsgCiAgICAgICAgICAgICAgdGhlbWUoYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNiksYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9MTEpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5NSIpLAogICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5MCIpKSAKIyBQbG90CnBsb3QucGh5c2ljYWxfc3Vic3RyIDwtIHBsb3QucGh5c2ljYWxfc3Vic3RyICsgIGNvb3JkX2ZsaXAoeWxpbT1jKC0wLjUsMC41KSwgeGxpbT1jKDEsMS4xKSkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKZ2dzYXZlKCJmaWd1cmVzL2ZpZ19TdHJSZXNpZF9QaHlzaWNhbC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9NCwgaGVpZ2h0PTQsIGRwaT0zMDAsIGNvbXByZXNzaW9uID0gJ2x6dycsIGJnPSJ0cmFuc3BhcmVudCIpCgojIEFsbApnZ2FycmFuZ2UocGxvdC5ldmVudF9zdWJzdHIsIHBsb3QuYWN0aXZpdHlfc3Vic3RyLCBwbG90LnNvY2lhbF9zdWJzdHIsIHBsb3QucGh5c2ljYWxfc3Vic3RyLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kPSJyaWdodCIpCmdnc2F2ZSgiZmlndXJlcy9maWdfU3RyUmVzaWRfTUFULnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD03LCBoZWlnaHQ9NywgZHBpPTMwMCwgY29tcHJlc3Npb24gPSAnbHp3JywgYmc9InRyYW5zcGFyZW50IikKYGBgCgojIyBNb29kIGFuZCBQaHlzaW9sb2d5CgpBcm91c2FsIGlzIG5vdCBhIHZhbGVuY2Ugc3BlY2lmaWMgbWVjaGFuaXNtLiBJbiB0aGUgc3RyZXNzIHdlZWssIHdlIHNlZSB0aGF0IHRoZXJlIGlzIGEgcmVkdWN0aW9uIGluIG91ciBwaHlzaW9sb2dpY2FsIGFyb3VzYWwgbWVhc3VyZXMsIGJ1dCBhbHNvIGluIHBvc2l0aXZlIGFmZmVjdC4gVG8gdGhpcyBlbmQsIHdlIGNoZWNrIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwaHlzaW9sb2d5IGFuZCB0aGUgbW9vZCBpdGVtcy4gV2UgZXhwZWN0IHRoYXQgd2hpbGUgYXJvdXNhbCBtZWFzdXJlcyBhcmUgaW5kZWVkIGFzc29jaWF0ZWQgd2l0aCBzdHJlc3MsIHRoZXkgYXJlIGFsc28gYXNzb2NpYXRlZCB3aXRoIHBvc2l0aXZlIG1vb2QuIApUbyB0aGlzIGVuZCwgd2UgbW9kZWwgdGhlc2UgcmVsYXRpb25zaGlwcyB3aXRoIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGFmZmVjdC4gV2UgdXNlIGEgbWF4aW1hbCBmaXR0aW5nIGFwcHJvYWNoIGFzIGJlZm9yZS4gIFdlIHNlZSBhIGhpZ2ggY29ycmVsYXRpb24gYmV0d2VlbiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbW9vZCAocHJlc2VudGVkIGJlbG93KSwgYW5kIHRoZXJlZm9yZSBhbHNvIG1vZGVsIGludGVyYWN0aW9uIHRlcm1zIGhlcmUuIER1ZSB0byBtb2RlbCBjb252ZXJnZW5jZSBpc3N1ZXMsIHdlIG9ubHkgbW9kZWwgdGhlIGZpeGVkIGludGVyY2VwdHMgaGVyZSBmb3IgdGhlIGZpeGVkIGVmZmVjdHMgb2YgaW50ZXJlc3QuIEFnYWluLCB3ZSBjaGVjayBhbGwgbW9kZWwgZmFtaWxpZXMgYmVmb3JlIHdlIHBpY2sgdGhlIG9uZSB3aXRoIHRoZSBiZXN0IGZpdC4gCgpgYGB7cn0KIHJjb3JyKGFzLm1hdHJpeChFTUFfRGF0YVssYygibW9vZF9wb3NpdGl2ZV9zIiwgIm1vb2RfbmVnYXRpdmVfcyIpXSkpCmBgYAoKIyMjIFNraW4gQ29uZHVjdGFuY2Ugey50YWJzZXR9CgojIyMjIE1lYW4gey19CmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuc2NfdG9uX21vb2QgPC0gZ2xtZXIoc2NfdG9uaWNfbWVhbl9zIH4gbW9vZF9wb3NpdGl2ZV9zKm1vb2RfbmVnYXRpdmVfcyArIAojICAgICBlbWFfYmVlcCArICMgSSB3aWxsIG1vZGVsIHRoZSBiZWVwIHRvIGZhY3RvciBjaXJjYWRpYW4gcmh5dGhtcwojICAgICBTZXggKyB0ZW1wX3Nsb3BlX3ogKyB0ZW1wX21lYW5feiArIAojICAgICBhY2NfZGVsdGEgKyBwaHlzaWNhbF9leGNlcmNpc2VfZHVyICsKIyAgICAgKDArbW9vZF9wb3NpdGl2ZV9zKm1vb2RfbmVnYXRpdmVfc3wgY2FzdG9yX3JlY29yZF9pZCkgKyMgKyAoMSttb29kX25lZ2F0aXZlX3N8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSkgKQoKIyBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5zY190b25fbW9vZCkKCmBgYAoKIyMjIyBOdW1iZXIgey19CmBgYHtyfQojIE1vZGVsCiMgZ2xtZXIuc2NfcGhudW1fbW9vZCA8LSBnbG1lcihzY19waGFzaWNfbnVtX3MgfiBtb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zICsgCiMgICAgIGVtYV9iZWVwICsgIyBJIHdpbGwgbW9kZWwgdGhlIGJlZXAgdG8gZmFjdG9yIGNpcmNhZGlhbiByaHl0aG1zCiMgICAgIFNleCArIHRlbXBfc2xvcGVfeiArIHRlbXBfbWVhbl96ICsgCiMgICAgIGFjY19kZWx0YSArIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKwojICAgICAoMSttb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSArIyArICgxK21vb2RfbmVnYXRpdmVfc3xjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpICkKCiMgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuc2NfcGhudW1fbW9vZCkKYGBgCgojIyMjIE1hZ25pdHVkZSB7LX0KYGBge3J9CiMgTW9kZWwKIyBnbG1lci5zY19waF9tYWdfbW9vZCA8LSBnbG1lcihzY19waGFzaWNfbWFnX3MgfiBtb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zICsgCiMgICAgIGVtYV9iZWVwICsgCiMgICAgIFNleCArIHRlbXBfc2xvcGVfeiArIHRlbXBfbWVhbl96ICsgCiMgICAgIGFjY19kZWx0YSArIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKwojICAgICAoMSttb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSAgKyAKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICBmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSwgb3B0Q3RybD1saXN0KG1heGZ1bj0xMDAwMDApICkpCgojIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLnNjX3BoX21hZ19tb29kKQpgYGAKCgojIyMjIEFVQyB7LX0KYGBge3J9CiMgTW9kZWwKIyBnbG1lci5zY19waF9hdWNfbW9vZCA8LSBnbG1lcihzY19waGFzaWNfYXVjX3MgfiBtb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zICsgCiMgICAgIGVtYV9iZWVwICsgCiMgICAgIFNleCArIHRlbXBfc2xvcGVfeiArIHRlbXBfbWVhbl96ICsgCiMgICAgIGFjY19kZWx0YSArIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKwojICAgICAoMSttb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSAgKwojICAgICAoMCtlbWFfYmVlcHxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArdGVtcF9zbG9wZV96fGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArdGVtcF9tZWFuX3p8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2FjY19kZWx0YXxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3BoeXNpY2FsX2V4Y2VyY2lzZV9kdXJ8Y2FzdG9yX3JlY29yZF9pZCksCiMgICAgIEVNQV9EYXRhLAojICAgICBmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksCiMgICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UpICkKCiMgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuc2NfcGhfYXVjX21vb2QpCmBgYAoKCiMjIyBIZWFydCBSYXRlIHsudGFic2V0fQoKIyMjIyBNZWFuIHstfQpgYGB7cn0KCiMgZ2xtZXIuaHJfbWVhbl9tb29kIDwtIGdsbWVyKGhyX21lYW5fcyB+IG1vb2RfcG9zaXRpdmVfcyptb29kX25lZ2F0aXZlX3MgKyAKIyAgICAgZW1hX2JlZXAgKyAjIEkgd2lsbCBtb2RlbCB0aGUgYmVlcCB0byBmYWN0b3IgY2lyY2FkaWFuIHJoeXRobXMKIyAgICAgU2V4ICsgdGVtcF9zbG9wZV96ICsgdGVtcF9tZWFuX3ogKyAKIyAgICAgYWNjX2RlbHRhICsgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArCiMgICAgICgxK21vb2RfcG9zaXRpdmVfcyptb29kX25lZ2F0aXZlX3N8IGNhc3Rvcl9yZWNvcmRfaWQpICArICMgKDErbW9vZF9wb3NpdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSArICgxK21vb2RfbmVnYXRpdmVfc3xjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLAojICAgICBjb250cm9sPWdsbWVyQ29udHJvbChjYWxjLmRlcml2cyA9IEZBTFNFKSApCgojIFN1bW1hcnkKbW9kZWxfb3V0cHV0KGdsbWVyLmhyX21lYW5fbW9vZCApCgpgYGAKCgojIyMjIE1pbiB7LX0KYGBge3J9CiMgZ2xtZXIuaHJfbWluX21vb2QgPC0gZ2xtZXIoaHJfbWluX3MgfiBtb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zICsgCiMgICAgIGVtYV9iZWVwICsgIyBJIHdpbGwgbW9kZWwgdGhlIGJlZXAgdG8gZmFjdG9yIGNpcmNhZGlhbiByaHl0aG1zCiMgICAgIFNleCArIHRlbXBfc2xvcGVfeiArIHRlbXBfbWVhbl96ICsgCiMgICAgIGFjY19kZWx0YSArIHBoeXNpY2FsX2V4Y2VyY2lzZV9kdXIgKwojICAgICAoMSttb29kX3Bvc2l0aXZlX3MqbW9vZF9uZWdhdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSAgKyAjICgxK21vb2RfcG9zaXRpdmVfc3wgY2FzdG9yX3JlY29yZF9pZCkgKyAoMSttb29kX25lZ2F0aXZlX3N8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK2VtYV9iZWVwfGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCt0ZW1wX3Nsb3BlX3p8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCt0ZW1wX21lYW5fenxjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArYWNjX2RlbHRhfGNhc3Rvcl9yZWNvcmRfaWQpICsgKDArcGh5c2ljYWxfZXhjZXJjaXNlX2R1cnxjYXN0b3JfcmVjb3JkX2lkKSwKIyAgICAgRU1BX0RhdGEsCiMgICAgIGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSwKIyAgICAgY29udHJvbD1nbG1lckNvbnRyb2woY2FsYy5kZXJpdnMgPSBGQUxTRSkgKQoKIyBTdW1tYXJ5Cm1vZGVsX291dHB1dChnbG1lci5ocl9taW5fbW9vZCApCgpgYGAKCiMjIyMgTWF4IHstfQpgYGB7cn0KIyBnbG1lci5ocl9tYXhfbW9vZCA8LSBnbG1lcihocl9tYXhfcyB+IG1vb2RfcG9zaXRpdmVfcyptb29kX25lZ2F0aXZlX3MgKyAKIyAgICAgZW1hX2JlZXAgKyAjIEkgd2lsbCBtb2RlbCB0aGUgYmVlcCB0byBmYWN0b3IgY2lyY2FkaWFuIHJoeXRobXMKIyAgICAgU2V4ICsgdGVtcF9zbG9wZV96ICsgdGVtcF9tZWFuX3ogKyAKIyAgICAgYWNjX2RlbHRhICsgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciArCiMgICAgICgxK21vb2RfcG9zaXRpdmVfcyptb29kX25lZ2F0aXZlX3N8IGNhc3Rvcl9yZWNvcmRfaWQpICArICMgKDErbW9vZF9wb3NpdGl2ZV9zfCBjYXN0b3JfcmVjb3JkX2lkKSArICgxK21vb2RfbmVnYXRpdmVfc3xjYXN0b3JfcmVjb3JkX2lkKSsKIyAgICAgKDArZW1hX2JlZXB8Y2FzdG9yX3JlY29yZF9pZCkrCiMgICAgICgwK3RlbXBfc2xvcGVfenxjYXN0b3JfcmVjb3JkX2lkKSArICgwK3RlbXBfbWVhbl96fGNhc3Rvcl9yZWNvcmRfaWQpKwojICAgICAoMCthY2NfZGVsdGF8Y2FzdG9yX3JlY29yZF9pZCkgKyAoMCtwaHlzaWNhbF9leGNlcmNpc2VfZHVyfGNhc3Rvcl9yZWNvcmRfaWQpLAojICAgICBFTUFfRGF0YSwKIyAgICAgZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLAojICAgIGNvbnRyb2w9Z2xtZXJDb250cm9sKGNhbGMuZGVyaXZzID0gRkFMU0UsICMsIG9wdGltaXplcj0iTmVsZGVyX01lYWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRDdHJsPWxpc3QobWF4ZnVuPTEwMDAwMCkpICkKCiMgU3VtbWFyeQptb2RlbF9vdXRwdXQoZ2xtZXIuaHJfbWF4X21vb2QgKQpgYGAKCgojIyMgUmVzdWx0czogTW9vZCBhbmQgUGh5c2lvbG9neQpgYGB7cn0KdGFibGUucGh5c2lvX21vb2QgPC0gdGFiX21vZGVsKGdsbWVyLnNjX3Rvbl9tb29kLCBnbG1lci5zY19waG51bV9tb29kLCBnbG1lci5zY19waF9tYWdfbW9vZCwgZ2xtZXIuc2NfcGhfYXVjX21vb2QsCiAgICAgICAgICAgICAgICBnbG1lci5ocl9tZWFuX21vb2QsIGdsbWVyLmhyX21pbl9tb29kLCBnbG1lci5ocl9tYXhfbW9vZCwKICAgICAgICAgIGR2LmxhYmVscz1jKCJTQyBUb25pYyIsICJTQyBOdW1iZXIiLCAiU0MgTWFnbml0dWRlIiwgIlNDIEFVQyIsICJIUiBNZWFuIiwgIkhSIE1pbiIsICJIUiBNYXgiKSwgCiAgICAgICAgICB0aXRsZT0iVGFibGUgWC4gUGh5c2lvIHZzLiBNb29kIiwKICAgICAgICAgICAgdHJhbnNmb3JtPU5VTEwsIHAuYWRqdXN0PSJmZHIiLCAKICAgICAgICAgc2hvdy5zdGF0PVRSVUUsCiAgICAgICAgIHNob3cuc2U9VFJVRSkKaHRtbFRhYmxlOjpodG1sVGFibGUodGFibGUucGh5c2lvX21vb2Qka25pdHIpCmBgYAoKCmBgYHtyfQojIFN1YnNldCB2YXJpYWJsZXMgb2YgaW50ZXJlc3RzCnBsb3QucGh5c2lvIDwtIHBsb3RfbW9kZWxzKGdsbWVyLnNjX3Rvbl9tb29kLCBnbG1lci5zY19waG51bV9tb29kLCBnbG1lci5ocl9tZWFuX21vb2QpCnJtX3Rlcm0gPC0gYXMudmVjdG9yKHBsb3QucGh5c2lvJGRhdGEkdGVybVsxOjk3XSkKcm1fdGVybSA8LSBybV90ZXJtW3JtX3Rlcm0gIT0gIm1vb2RfcG9zaXRpdmVfcyIgJiBybV90ZXJtIT0ibW9vZF9uZWdhdGl2ZV9zIl0KIyBTZXQgdGhlIGNvbG91cnMKY29sX2xpc3QgPC1jKCcjNzU3MEIzJywnIzc1NzBCMycsJyM3NTcwQjMnLCIjRDk1RjAyIiwgIiNEOTVGMDIiLCAnI0Q5NUYwMicsICcjRDk1RjAyJywgIiMxQjlFNzciLCAiIzFCOUU3NyIpCgoKIyBNYWtlIHRoZSBwbG90CnBsb3QucG9zX21vb2RfcmVzaWQgPC0gcGxvdF9tb2RlbHMoIGdsbWVyLnNjX3Rvbl9tb29kLCBnbG1lci5zY19waG51bV9tb29kLCBnbG1lci5zY19waF9tYWdfbW9vZCwgZ2xtZXIuc2NfcGhfYXVjX21vb2QsCiAgICAgICAgICAgICAgICBnbG1lci5ocl9tZWFuX21vb2QsIGdsbWVyLmhyX21pbl9tb29kLCBnbG1lci5ocl9tYXhfbW9vZCwKICAgICAgICAgICAgICBtLmxhYmVscz1jKCJTQyBUb25pYyIsICJTQyBOdW1iZXIiLCAiU0MgTWFnbml0dWVkIiwgIlNDIEFVQyIsIkhSIE1lYW4iLCAiSFIgTWluaW11bSIsICJIUiBNYXhpbXVtIiksCiAgICAgICAgICAgYXhpcy5sYWJlbHMgPSBjKCIgIiksCiAgICAgICAgICAgICMgU3Rhc3Rpc3RpY2FsIFN0dWZmCiAgICAgICAgICAgdHJhbnNmb3JtPU5VTEwsCiAgICAgICAgICAgIHJtLnRlcm1zID0gcm1fdGVybSwKICAgICAgICAgICAgI3Nob3cudmFsdWVzID0gVCwKICAgICAgICAgICAgI3ZhbHVlLnNpemUgPSA0LCAKICAgICAgICAgICAgI3N0ZC5lc3Q9VCwgCiAgICAgICAgICAgIHNob3cucD1ULAogICAgICAgICAgICBwLnNoYXBlPVQsCiAgICAgICAgICAgIHAuYWRqdXN0ID0gImZkciIsIAogICAgICAgICAgICBsZWdlbmQucHZhbC50aXRsZSA9ICJTaWduaWZpY2FuY2UiLCAKICAgICAgICAgICAgIyBWaXN1YWwgU3R1ZmYKICAgICAgICAgICAgY29sb3JzPWNvbF9saXN0LAogICAgICAgICAgICBkb3Quc2l6ZT0yLAogICAgICAgICAgICBsaW5lLnNpemUgPSAxLAogICAgICAgICAgICBzcGFjaW5nPTAuNywgCiAgICAgICAgICAgIHZsaW5lLmNvbG9yID0gImRhcmtncmV5IiwgCiAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9ICIiKSArIAogICAgICAgICAgICBwdGhlbWUgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoIC0wLjIsIC0uMSwwLCAuMSwuMikpICsgCiAgICAgICAgICAgIHRoZW1lKGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYpLGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPTExKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTUiKSwKICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5OTAiKSkgCiMgUGxvdCBhbmQgU2F2ZQpwbG90LnBvc19tb29kX3Jlc2lkICsgY29vcmRfZmxpcCh5bGltPWMoLS4yNSwuMjUpKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTk1IiksIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTkwIikpCmdnc2F2ZSgiZmlndXJlcy9maWdfTW9vZGtSZXNpZF9BTEwudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTUsIGhlaWdodD01LCBkcGk9MzAwLCBjb21wcmVzc2lvbiA9ICdsencnLCBiZz0idHJhbnNwYXJlbnQiKQpgYGAKCgojIyBNZWRpYXRpb24gYW5heWxzaXMKCkluIHRoZSBzdHJlc3Mgd2Vlaywgd2Ugc2VlIGEgZGVjcmVhc2UgaW4gYm90aCBwb3NpdGl2ZSBtb29kIGFuZCBwaHlzaW9sb2d5LiBIb3dldmVyLCB3ZSBhbHNvIHNlZSBhbiBpbmNyZWFzZSBpbiBzdHJlc3MgZHVyaW5nIHRoaXMgdGltZSB0b28uIFRoaXMgaXMgY29uZnVzaW5nIGdpdmVuIHRoZSBtb21lbnQgdG8gbW9tZW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN1YmplY3RpdmUgc3RyZXNzIGFuZCBwaHlzaW9sb2d5LiBPbmUgcG90ZW50aWFsIGV4cGxhbmF0aW9uIGlzIHRoYXQgdGhlIHBoeXNpb2xvZ3kgaXMgbW9yZSBzdHJvbmdseSBhc3NvY2lhdGUgd2l0aCBwb3NpdGl2ZSBhcm91c2FsIGFuZCBvcHBvc2VkIHRvIG5lZ2F0aXZlIGFyb3VzYWwuIFNvIHdlIG5lZWQgdG8gYWN0dWFsbHkgY29uZmlybSB0aGF0IHdoYXQgd2Ugc2VlIGluIHRoZSBzdHJlc3Mgd2VlayAoaS5lLiB0aGUgcGh5c2lvbG9neSBhcm91c2FsIGRlY3JlYXNlKSBpcyBhY3R1YWxseSBkdWUgdG8gdGhlIHBvc2l0aXZlIG1vb2QgY2hhbmdlcy4gVG8gdGhpcyBlbmQsIHdlIHBlcmZyb20gYSBtZWRpYXRpb24gYW5hbHlzaXMuIFdlIGZpcnN0IG5lZWQgdG8gZmlsdGVyIG91dCB0aGUgbmFuJ3MgaGVyZSBmb3Igc29tZSByZWFzb24gdGhvdWdoLiBXZSBjYW50IGFwcGx5IHRoaXMgYW5hbHlzaXMgdG8gbWl4ZWQgbGV2ZWwgbW9kZWxzLCBzbyB3ZSBpbnN0ZWFkIGp1c3QgY2hlY2sgdGhlIHNpbXBsZSBtb2RlbHMgaGVyZS4KCmBgYHtyfQpsaWJyYXJ5KG1lZGlhdGlvbikKc2V0LnNlZWQoMTIzKQoKRU1BX1N1YiA8LSBFTUFfRGF0YSAlPiUgZHBseXI6OnNlbGVjdChjYXN0b3JfcmVjb3JkX2lkLCBXZWVrX1R5cGUsIHNjX3BoYXNpY19tYWdfcywgc2NfcGhhc2ljX251bV9zLCBtb29kX3Bvc2l0aXZlX3MsIGV2ZW50X3RvdF9zLCAgU2V4LCBQcm9ncmFtLCAjIE1vZGVsIHBvcCBkaWZmZXJlbmNlcwogICAgRmlyc3RfV2VlaywgIGVtYV9iZWVwX2YsIGVtYV9kYXksIAogICAgcGh5c2ljYWxfZXhjZXJjaXNlX2R1ciwgYWNjX2RlbHRhLCAKICAgIHRlbXBfbWVhbl96LHRlbXBfc2xvcGVfeikgJT4lIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKYGBgCgpUd28gYXJvdXNhbCBtZWFzdXJlcyB3ZXJlIHJlZHVjZWQgaW4gdGhlIHN0cmVzcyB3ZWVrLCBidXQgYWxzbyBhc3NvY2lhdGVkIHdpdGggaW5jcmVhc2VkIHN1YmplY3RpdmUgc3RyZXNzLiBUaGVzZSBtZWFzdXJlcyB3ZXJlIHRoZSAqKm51bWJlciBvZiBza2luIGNvbmR1Y3RhbmNlIHJlc3BvbnNlcyoqIGFuZCB0aGUgKiptYWduaXR1ZGUgb2Ygc2tpbiBjb25kdWN0YW5jZSByZXNwb25zZXMqKi4gU28gaGVyZSB3ZSB3aWxsIGNoZWNrIHRoZSBtZWRpYXRpbmcgZWZmZWN0IG9mIHBvc2l0aXZlIG1vb2QuIAoKIyMjIFNDIE51bWJlcgpGaXJzdCB3ZSBjaGVjayB3aGV0aGVyIHBvc2l0aXZlIG1vb2QgbWVkaWF0ZXMgdGhlIGVmZmVjdHMgb2Ygd2VlayB0eXBlIG9mIHRoZSBudW1iZXIgb2YgcmVzcG9uc2VzLiBXZSBzZWUgaW4gdGhlIGNvbnRyb2wgd2VlaywgdGhlcmUgaXMgYSB0cmVuZCB3aXRoIHBvc2l0aXZlIGFmZmVjdCBtZWRpYXRpbmcgIHRoZSBudW1iZXIgb2Ygc2tpbiBjb25kdWN0YWNlIHJlc3BvbnNlcy4gCmBgYHtyfQojIE1haW4gZWZmZQpmaXQudG90YWxlZmZlY3Q9Z2xtZXIoc2NfcGhhc2ljX251bV9zIH4gV2Vla19UeXBlICsgKDF8Y2FzdG9yX3JlY29yZF9pZCksIEVNQV9TdWIpCiNzdW1tYXJ5KGZpdC50b3RhbGVmZmVjdCkKCiMgTWVkaWF0aW9ucwpmaXQubWVkaWF0b3I9Z2xtZXIobW9vZF9wb3NpdGl2ZV9zIH4gV2Vla19UeXBlICsgKDF8Y2FzdG9yX3JlY29yZF9pZCksIEVNQV9TdWIpCiNzdW1tYXJ5KGZpdC5tZWRpYXRvcikKCiMgQ29tYmluZWQKZml0LmR2PWdsbWVyKHNjX3BoYXNpY19udW1fcyB+IFdlZWtfVHlwZSptb29kX3Bvc2l0aXZlX3MgKyAoMXxjYXN0b3JfcmVjb3JkX2lkKSwgRU1BX1N1YikKI3N1bW1hcnkoZml0LmR2KQoKIyBNZWRpYXRpb24gYW5hbHlzaXMKcmVzdWx0czEgPSBtZWRpYXRlKG1vZGVsLm09Zml0Lm1lZGlhdG9yLCBtb2RlbC55PWZpdC5kdiwgdHJlYXQ9J1dlZWtfVHlwZScsIG1lZGlhdG9yPSdtb29kX3Bvc2l0aXZlX3MnLCBzaW1zPTUwMDAsIGNvbnRyb2wudmFsdWU9IkNvbnRyb2wiLCB0cmVhdC52YWx1ZT0iU3RyZXNzIikKc3VtbWFyeShyZXN1bHRzMSkKCmBgYAoKIyMjIFNDIE1hZ25pdHVkZQpXZSBuZXh0IGNoZWNrIHRoZSBtZWRpYXRpbmcgZWZmZWN0IG9mIHBvc2l0aXZlIGFmZmVjdCBvbiBza2luIGNvZHVjdGFuY2UgbWFnbml0ZGUuIEhlcmUgd2Ugc2VlIHRoYXQgdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmVzcG9uc2VzIGlzIHNpZ25pZmljYW5sdHkgbWVkaWF0ZWQgYnkgcG9zaXRpdmUgYWZmZWN0LiBJdCBzZWVtcyBpbiBib3RoIGNhc2VzLCB0aGVzZSBlZmZlY3RzIGFyZSBiZWluZyBkcml2ZW4gYnkgdGhlIGNvbnRyb2wgd2Vlay4KYGBge3J9CiMgTWFpbiBlZmZlY3QKZml0LnRvdGFsZWZmZWN0PWdsbWVyKHNjX3BoYXNpY19tYWdfcyB+IFdlZWtfVHlwZSAgKyAoMXxjYXN0b3JfcmVjb3JkX2lkKSwgRU1BX1N1YikKc3VtbShmaXQudG90YWxlZmZlY3QpCgojIE1lZGlhdGlvbnMKZml0Lm1lZGlhdG9yPWdsbWVyKG1vb2RfcG9zaXRpdmVfcyB+IFdlZWtfVHlwZSAgKyAgKDF8Y2FzdG9yX3JlY29yZF9pZCksIEVNQV9TdWIpCnN1bW0oZml0Lm1lZGlhdG9yKQoKIyBDb21iaW5lZApmaXQuZHY9Z2xtZXIoc2NfcGhhc2ljX21hZ19zIH4gV2Vla19UeXBlKm1vb2RfcG9zaXRpdmVfcyArICgxfGNhc3Rvcl9yZWNvcmRfaWQpLCBFTUFfU3ViKQpzdW1tKGZpdC5kdikKCiMgTWVkaWF0aW9uIGFuYWx5c2lzCnJlc3VsdHMyID0gbWVkaWF0ZShtb2RlbC5tPWZpdC5tZWRpYXRvciwgbW9kZWwueT1maXQuZHYsIHRyZWF0PSdXZWVrX1R5cGUnLCBtZWRpYXRvcj0nbW9vZF9wb3NpdGl2ZV9zJywgYm9vdD1GLCBzaW1zPTUwMDApCnN1bW1hcnkocmVzdWx0czIpCgpgYGAKCiMgUmFuZG9tIEZvcmVzdHMKCldlIHdlcmUgYWJsZSB0byBlc3RhYmxpc2ggdGhhdCBwaHlzaW9sb2d5IGFuZCBtb29kIGJvdGggY2hhbmdlIGluIHRoZSB3ZWVrcyB1bmRlciBjaHJvbmljIHN0cmVzcy4gVGhhdCBpcyBnb29kLCBiZWNhdXNlIG5vdyB3ZSBjYW4gc2VlIGhvdyB3ZWxsIHdlIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpbiBwcmVkaWN0aXZlIG1vZGVscy4gVG8gdGhpcyBlbmQsIHdlIHVzZSB0aGUgcmFuZG9tRm9yZXN0IHBhY2thZ2UgcGx1cyBzb21lIGV4dHJhIGZ1bmN0aW9ucyB0byB0ZXN0IG91ciBwcmVkaWN0aW9uLiBUaGUgcG9pbnQgb2YgdGhpcyBhbmFseXNpcyBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB3YXMgY2FuIHVzZSB0aGUgRVBBL3dyaXN0d2F0Y2ggbWVhc3VyZXMgb24gdGhlaXIgb3duIHRvIGNsYXNzaWZ5IHdoaWNoIHdlZWsgcGFydGljaXBhbnRzIGFyZSBpbiwgYW5kIHRvIGFkZGl0aW9uYWxseSBjaGVjayB3aGV0aGVyIHRoaXMgd291bGQgYmUgYXMgZ29vZCBhcyBhc2tpbmcgYWJvdXQgbW9vZC4gRmluYWxseSwgd2Ugd2lsbCBzZWUgd2hldGhlciB0aGUgY29tYmluYXRpb24gb2YgYm90aCB0aGUgbW9vZCBhbmQgRVBBIG1lYXN1cmVzIGlzIGFjdHVhbGx5IHRoZSBiZXN0IG9wdGlvbi4gCgpCZWZvcmUgd2UgYmVnaW4sIHdlIGxvYWQgdGhlIHJlcXVpcmVkIGxpYnJhcnksIGFuZCBwcmVzZXQgdGhlIHNlZWQgdG8ga2VlcCB0aGUgYW5hbHlzaXMgY29uc2lzdGVudC4gV2UgYWRkaXRpb25hbGx5IGZpbHRlciBvdXQgdGhlIGluY29tcGxldGUgZGF0YXBvaW50cyBvbiBvbmx5IGtlZXAgdGhlIGZ1bGwgZGF0YXNldCAKYGBge3J9CmxpYnJhcnkocmFuZG9tRm9yZXN0KQpzZXQuc2VlZCgxMjMpCgojIFZhcmlhYmxlcyBmb3IgRm9yZXN0CnZhcnMuZm9yZXN0IDwtIGMoICJXZWVrX1R5cGUiLCAibW9vZF9wb3NpdGl2ZSIsICJtb29kX25lZ2F0aXZlIiwgInNjX3RvbmljX21lYW4iLCAic2NfcGhhc2ljX21hZyIsICJzY19waGFzaWNfZHVyIiwgInNjX3BoYXNpY19hdWMiLCAic2NfcGhhc2ljX251bSIsImhyX21lYW4iLCAiaHJfbWF4IiwgImhyX21pbiIsICJocl9zZCIsICJhY2NfZGVsdGEiLCAidGVtcF9tZWFuIikKdmFycy5mb3Jlc3QucGh5c2lvIDwtYyggInNjX3RvbmljX21lYW4iLCAic2NfcGhhc2ljX21hZyIsICJzY19waGFzaWNfZHVyIiwgInNjX3BoYXNpY19hdWMiLCAic2NfcGhhc2ljX251bSIsImhyX21lYW4iLCAiaHJfbWF4IiwgImhyX21pbiIsICJocl9zZCIsICJXZWVrX1R5cGUiICkKCiMgU3Vic2V0IHRoZSBkYXRhCmRmLlJhbmRvbUZvcmVzdCA8LSBFTUFfRGF0YVssdmFycy5mb3Jlc3RdCmRmLlJhbmRvbUZvcmVzdCA8LSBuYS5vbWl0KGRmLlJhbmRvbUZvcmVzdCkKZGYuUmFuZG9tRm9yZXN0LnBoeXNpbyA8LSBkZi5SYW5kb21Gb3Jlc3RbLHZhcnMuZm9yZXN0LnBoeXNpb10KYGBgCgojIyBPT0IgRXJyb3Igey50YWJzZXR9CgpXZSBmaXJzdCBydW4gdGhlIGZpcnN0IGFuYWx5c2lzIHRvIGVzdGFibGlzaCB0aGUgT3V0LU9mLUJhZyAoT09CKSBlcnJvciByYXRlIHdpdGhvdXQgYW55IGNyb3NzIHZhbGlkYXRpb24uIFRoaXMgaXMgZG9uZSB0byBlc3RhYmxpc2ggdGhlIG1vZGVscyBmaXJzdCwgYW5kIGZpbmUgdHVuZSB0aGUgcGFyYW10ZXJzIChmb3IgZXhhbXBsZSwgdGhlIG51bWJlciBvZiB0cmVlcyByZXF1aXJlZCBmb3IgbW9kZWwgc3RhYmlsaXR5IGFuZCBzdWNoKS4gVGhpcyBpcyBkb25lIHdpdGggdGhyZWUgbW9kZWxzIGluIG1pbmQ6CgpNb2RlbCAxLiBNb29kCk1vZGVsIDIuIFBoeXNpb2xvZ3kKTW9kZWwgMy4gQ29tYmluYXRpb24KCk1vZGVsIDEgY2xhc3NpZmllcyB3ZWVrIGZyb20gdGhlIEVNQSBtb29kIG91dGNvbWVzLCB3aGlsZSBNb2RlbCAyIGRvZXMgdGhlIHNhbWUgdXNpbmcgdGhlIEVQQSBvdXRwdXQuIFdlIHRoZW4gZmluYWxseSB0ZXN0IHRoZXNlIG1vZGVscyB1c2luZyB0aGUgY29tYmluYXRpb24gdGhlcmVvZiBpbiBNb2RlbCAzLiBBZnRlciB3ZSBjaGVjayB0aGVzZSBtb2RlbHMsIHdlIGNhbiB0aGVuIGdvIGFoZWFkIGFuZCBydW4gdGhlIG1vZGVscyB3aXRoIGNyb3NzIHZhbGlkYXRpb24gaW4gdGhlIG5leHQgc2VjdGlvbnMuQmFzZWQgb24gdGhlIE9PQiwgd2Ugc2VlIHRoYXQgdGhlIGNvbWJpbmVkIG1vZGVsIGRvZXMgdGhlIGJlc3QsIHdoaWxlIHRoZSBwaHlzaW9sb2d5IG1vZGVsIGRvZXMgdGhlIHdvcnN0LiAKCiMjIyBNb2RlbCAxOiBNb29kIHstfQpUaGlzIG1vZGVsIGNsYXNzaWZpZXMgd2VlayB0eXBlIGZyb20gdGhlIGFmZmVjdCBpdGVtcwpgYGB7cn0KIyBSdW4gcmFuZG9tIGZvcmVzdCBtb2RlbCBmb3IgbW9vZCB2YXJzCmZvcmVzdC5tb29kIDwtIHJhbmRvbUZvcmVzdChXZWVrX1R5cGUgfiBtb29kX3Bvc2l0aXZlICsgbW9vZF9uZWdhdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGYuUmFuZG9tRm9yZXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50cmVlPTUwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW5jZSA9IFRSVUUpCmZvcmVzdC5tb29kCmBgYAoKIyMjIE1vZGVsIDI6IFBoeXNpbyB7LX0KTm93IHdlIGNhbiBjaGVjayB3aGF0IHRoZSBwaHlzaW8gZGF0YSBsb29rcyBsaWtlLiAKYGBge3J9CiMgUnVuIHJhbmRvbSBmb3Jlc3QgZnVsbCBtb2RlbAp2YXJzLmZvcmVzdC5waHlzaW8gPC0gYyggInNjX3RvbmljX21lYW4iLCAic2NfcGhhc2ljX21hZyIsICJzY19waGFzaWNfZHVyIiwgInNjX3BoYXNpY19hdWMiLCAic2NfcGhhc2ljX251bSIsImhyX21lYW4iLCAiaHJfbWF4IiwgImhyX21pbiIsICJocl9zZCIsICJhY2NfZGVsdGEiLCAidGVtcF9tZWFuIikKZm9yZXN0LmZ1bGwgPC0gcmFuZG9tRm9yZXN0KCBhcy5mb3JtdWxhKHBhc3RlKCJXZWVrX1R5cGUiLCAifiIsIChwYXN0ZSh2YXJzLmZvcmVzdC5waHlzaW8sIGNvbGxhcHNlPSIrIikpKSkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kZi5SYW5kb21Gb3Jlc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRyZWU9NTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFuY2UgPSBUUlVFKQpmb3Jlc3QuZnVsbApyYW5kb21Gb3Jlc3Q6OmltcG9ydGFuY2UoZm9yZXN0LmZ1bGwpCmBgYAoKCiMjIyBNb2RlbCAzOiBDb21iaW5lZCB7LX0KTmV4dCB1cCB3ZSBjaGVjayB0aGUgZW50aXJlIGRhdGEgc2V0IGFuZCBzZWUgaWYgdXNpbmcgYm90aCBpcyBnb29kLiAKYGBge3J9CiMgUnVuIHRoZSBmb3Jlc3Qgd2l0aCBtb3N0IGltcG9ydGFudCBmZWF0dXJlcwpmb3Jlc3QuaW1wb3J0YW50IDwtIHJhbmRvbUZvcmVzdChXZWVrX1R5cGUgfiAuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1kZi5SYW5kb21Gb3Jlc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRyZWU9NTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFuY2UgPSBUUlVFKQpmb3Jlc3QuaW1wb3J0YW50CmBgYAoKCiMjIExPQk8KCkluIG9yZGVyIHRvIHBlcmZvcm0gdGhlIHZhbGlkYXRpb24sIHdlIHRyeSBvdXQgYSBsZWF2ZS1vbmUtYmVlcC1vdXQgKExPQk8pIGFuYWx5c2lzLiBUaGlzIGFuYWx5c2lzIHdpbGwgcnVuIGEgcmFuZG9tIGZvcmVzdCBtb2RlbCBmb3IgZWFjaCBzdWJqZWN0IHNlcGFyYXRlbHksIGxlYXZpbmcgb3V0IG9uZSBzdXJ2ZXkgd2hlbiBydW5uaW5nIHRoZSBtb2RlbC4gV2UgdGhlbiB0ZXN0IHRoZSBtb2RlbCBvbiB0aGUgYmVlcCB0aGF0IHdhcyBsZWZ0IG91dC4gV2UgcmVwZWF0IHRoaXMgcHJvY2VzcyBmb3IgdGhlIHN1YmplY3QgdW50aWwgd2UndmUgcmVtb3ZlZCBlYWNoIHN1cnZleS9iZWVwIG91dCBvbmNlLiBUaGlzIHJlc3VsdHMgaW4gYSBzZXJpZXMgb2YgcHJlZGljdGlvbnMgdGhhdCBnaXZlIHVzIGFuIGVycm9yIGxldmVsIGZvciBlYWNoIHN1YmplY3QuIEluIG9yZGVyIHRvIGRvIHRoaXMsIHdlIGhhdmUgZGV2ZWxvcGVkIGEgZnVuY3Rpb24gdGhhdCBpcyBwcm92aWRlZCBpbiB0aGlzIGdpdGh1YiBkaXJlY3RvcnkgbWVudGlvbmVkIGluIHRoZSBpbnRyb2R1Y3Rvbi4gVGhpcyB3aWxsIHByb2R1Y2UgdGhlIGNsYXNzaWZpY2F0aW9uIGVycm9ycyBmb3IgZWFjaCBzdWJqZWN0LgoKV2UgYWxzbyBuZWVkIHRvIHRlc3QgYWxsIG91ciBtb2RlbHMgYWdhaW5zdCB0aGUgIHRydWUgY2hhbmNlIGxldmVscy4gT25lIGNhbiBhc3N1bWUgaW4gdGhlb3J5IHRoYXQgdGhlIHByZWRpY3Rpb24gZXJyb3IgZm9yIGEgZGljaG90b21vdXMgdmFyaWFibGUgaXMgNTAvNTAsIGJ1dCB3ZSBkb250IGxpa2UgdG8gZG8gdGhpbmdzIHRoZSBlYXN5IHdheS4gSW5zdGVhZCwgd2Ugd2lsbCBkbyAxMDAwMCBpdGVyYXRpb25zIHdoZXJlIHdlIGJvb3RzdHJhcCByZXNhbXBsZSB0aGUgc3RyZXNzIGFuZCBjb250cm9sIHdlZWtzLiBUaGlzIHdpbGwgZ2l2ZSB1cyB0aGUgcmVhbCBlcnJvciByYXRlIHdpdGggYSBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoaXMgd2FzIG1hZGUgaW50byBhIGZ1bmN0aW9uLCBidXQgZm9yIHNvbWUgcmVhc29uIEkgY291bGRudCBnZXQgdGhlIGZ1bmN0aW9uIHRvIHJ1biBpbiBwYXJhbGxlbCBwcm9jZXNzaW5nIG9uIG91ciB1bml4IHN5c3RlbS4gU28gaW5zdGVhZCBJIHJ1biB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZyBvZiB0aGUgYm9vdHN0cmFwIG91dHNpZGUgb2YgYSBmdW5jdGlvbi4gSXRzIG5vdCBwcmV0dHksIGJ1dCBpdCB3b3Jrcy4gCgpXZSBhbHNvIHRlc3QgdGhlIExPQk8gbW9kZWwgdXNpbmcgYWdhaW5zdCB0aGUgYm9vdHN0cmFwcGVkIExPQk8gbW9kZWwuIFdlIGFsc28gbWFkZSBhIGZ1bmN0aW9uIHRvIGRvIHRoaXMuIFRoZSBmdW5jdGlvbiBlc3RpbWF0ZXMgdGhlIHAtdmFsdWUgYnkgY29tcGFyaW5nIGl0IHRvIHRoZSBwZXJtdWF0aW9uIHRlc3QgZGlzdHJpYnV0aW9uLiBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgdGhlIG9wdGlvbiB0byBlc3RpbWF0ZSB0aGUgcC12YWx1ZSBmcm9tIGFuIGFzc3VtZWQgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgYnV0IHdlIHNpbXBseSB1c2UgdGhlIGFjdHVhbCBkaXN0cmlidXRpb24gZm9yIHRoaXMuIFdlIGFkZGl0aW9uYWxseSBjb21wdXRlIGEgY29tYmluZWQgcC12YWx1ZSB3aXRoIHRoaXMgZnVuY3Rpb24gdXNpbmcgU3RvdWZmZXLFmyBtZXRob2QgYW5kIHRoZSBwb29sciBwYWNrYWdlLiAKClRoaXMgcmVzdWx0cyBpbiB0aGUgdGhyZWUgdGFicyBmb3IgZWFjaCBtb2RlbDoKCjEuICoqTW9kZWw6KiogQ29udGFpbnMgdGhlIGFjdHVhbCByZXN1bHRzIG9mIHRoZSBMT0JPIG1vZGVsCjIuICoqQm9vdHN0cmFwOioqIENvbnRhaW5zIHRoZSBib290c3RyYXAgZXJyb3IgZXN0aW1hdGlvbiByZXN1bHRzCjMuICoqU3RvdWZmZXIncyB0ZXN0czoqKiBDb250YWlucyB0aGUgdGVzdHMgYWdhaW5zdCB0aGUgbnVsbCBkaXN0cmlidXRpb24gYW5kIHRoZSBwb29sZWQgcC12YWx1ZXMKCiMjIyBNb2RlbCAxOiBNb29kIHsudGFic2V0fQpTb21lIHBhcnRzIG9mIHRoZSBjb2RlIGFyZSBjb21tZW50ZWQgdG8gbWFrZSBwcm9kdWNpbmcgdGhlIG5vdGVib29rIGVhc2llciwgd2Ugc2VlIHRoYXQgdGhlIG1lYW4gTE9CTyBlcnJvciByYXRlIGlzIDMzLjQ1IHBlcmNlbnQsIGFuZCB0aGF0IHRoZSBtb2RlbCBwZXJmb3JtcyByZWxhdGl2ZWx5IHdlbGwgb24gbW9zdCBzdWJqZWN0cy4gQmFzZWQgb24gdGhlIGVzdGltYXRlZCBib290c3RyYXAgZXJyb3IgZGlzdHJpYnV0aW9uIG9mIGFyb3VuZCA1MCUsIHdlIGFsc28gc2hvdyB0aGF0IHRoaXMgbW9kZWwgcGVyZm9ybXMgYWJvdmUgY2hhbmNlLiAKCiMjIyMgTW9kZWwgey19CmBgYHtyfQojIFRoZW4gd2l0aCB0aGUgZnVsbCBtb2RlbAp2YXJzLmZvcmVzdC5tb29kIDwtICBjKCJtb29kX3Bvc2l0aXZlX2MiLCAibW9vZF9uZWdhdGl2ZV9jIikKIyBmb3Jlc3QubG9iby5tb29kIDwtIHJmLmxvYm8oRGF0YT1FTUFfRGF0YSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJOcj0iY2FzdG9yX3JlY29yZF9pZCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHZhcnM9dmFycy5mb3Jlc3QubW9vZCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dmFyPSJXZWVrX1R5cGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVHJlZT01MDAwKQphcy5kYXRhLmZyYW1lKGZvcmVzdC5sb2JvLm1vb2QkdG90YWwkc3ViamVjdF9lcnJvcnMpCnBzeWNoOjpkZXNjcmliZShmb3Jlc3QubG9iby5tb29kJHRvdGFsJHN1YmplY3RfZXJyb3JzKQoKYGBgCgoKCiMjIyMgQm9vdHN0cmFwey19CmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgQm9vdHN0cmFwTE9CTy4KIyB7IGNsIDwtIG1ha2VDbHVzdGVyKE5vQ29yZXMtMSkKIyByZWdpc3RlckRvU05PVyhjbCkKIyBpdGVyYXRpb25zIDwtIDEwMDAwCiMgcHJpbnQoIlJ1bm5pbmcsIHRoaXMgd2lsbCB0YWtlIGEgd2hpbGUuLi4iLCBxdW90ZT1GKQojIHBiIDwtIHR4dFByb2dyZXNzQmFyKG1heCA9IGl0ZXJhdGlvbnMsIHN0eWxlID0gMykKIyBwcm9ncmVzcyA8LSBmdW5jdGlvbihuKSBzZXRUeHRQcm9ncmVzc0JhcihwYiwgbikKIyBvcHRzIDwtIGxpc3QocHJvZ3Jlc3MgPSBwcm9ncmVzcykKIyBmb3Jlc3QuYm9vdC5tb29kIDwtIGZvcmVhY2goaT0xOml0ZXJhdGlvbnMsIC5vcHRpb25zLnNub3cgPSBvcHRzICkgJWRvcGFyJSB7CiMgICAgIHJmLkJvb3RzdHJhcEVycm9yKERhdGE9RU1BX0RhdGEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBTaHVmZmxlPSJXZWVrX1R5cGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0aW9ucz0xLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViamVjdElkPSJjYXN0b3JfcmVjb3JkX2lkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2YXI9dmFycy5mb3Jlc3QubW9vZCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2YXI9IldlZWtfVHlwZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlcz01MDApCiMgfQojIHByaW50KCJEb25lISIsIHF1b3RlPUYpCiMgc3RvcENsdXN0ZXIoY2wpCiMgIyBOb3cgbWVyZ2UgdGhlbSBpbnRvIG9uZSBkYXRhZnJhbWUKIyBwYiA8LSB0eHRQcm9ncmVzc0JhcihtYXggPWxlbmd0aChmb3Jlc3QuYm9vdC5tb29kKSwgc3R5bGUgPSAzKQojIGZvcmVzdC5ib290Lm1vb2QubWVyZ2UgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QuYm9vdC5tb29kW1sxXV1bMl0pCiMgZm9yIChpIGluIDI6bGVuZ3RoKGZvcmVzdC5ib290Lm1vb2QpKSB7CiMgICAgIHNldFR4dFByb2dyZXNzQmFyKHBiLCBpKQojICAgICBkZi4ybWVyZ2UgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QuYm9vdC5tb29kW1tpXV1bMl0pCiMgICAgIGZvcmVzdC5ib290Lm1vb2QubWVyZ2UgPC0gbWVyZ2UgKGRmLjJtZXJnZSwgZm9yZXN0LmJvb3QubW9vZC5tZXJnZSAsIGJ5PSJEYXRhRnJhbWUuaWQiKQojIH0KIyAjIEFmdGVyIG1lcmdpbmcgdGhlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBkYXRhIGZyYW1lLCBsZXRzIGFsc28gZXZlcmFnZSB0aGUgZXJyb3IgcmF0ZQojIGZvcmVzdC5ib290Lm1vb2QubWVyZ2UkYXZlcmFnZUVycm9yIDwtIHJvd01lYW5zKGZvcmVzdC5ib290Lm1vb2QubWVyZ2UgWywgLXdoaWNoKG5hbWVzKCBmb3Jlc3QuYm9vdC5tb29kLm1lcmdlKSAlaW4lIGMoIkRhdGFGcmFtZS5pZCIpKV0sIG5hLnJtPVQpCiMgc2F2ZVJEUyhmb3Jlc3QuYm9vdC5tb29kLm1lcmdlLCBmaWxlID0gImRhdGEvYm9vdHN0cmFwX21vb2QucmRzIikKIyB9CmBgYCAKCgpOb3cgdGhhdCB3ZSBoYXZlIHJ1biB0aGUgYm9vdHN0cmFwLCB3ZSBhbHNvIHNhdmUgaXQganVzdCBpbiBjYXNlLCBhbmQgdGhlbiB3ZSBnZXQgdGhlIGF2ZXJhZ2UgZXJyb3IsIGFuZCBjYWxjdWFsdGUgdGhlIHRydWUgU0QgYW5kIFNFIGZyb20gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gCmBgYHtyfQojIFByaW50IHRoZSBFcnJvcnMKYm9vdC5tb29kLmRlc2NyIDwtIHBzeWNoOjpkZXNjcmliZShmb3Jlc3QuYm9vdC5tb29kLm1lcmdlJGF2ZXJhZ2VFcnJvcikKIyBBbHNvIGdldCB0aGUgdHJ1ZSBTRCBvZiBib290c3RyYXBzCmJvb3QubW9vZC5kZXNjciRzZCA8LSBtZWFuKChwc3ljaDo6ZGVzY3JpYmUoZm9yZXN0LmJvb3QubW9vZC5tZXJnZSkpJHNkLCBuYS5ybT1UKQpib290Lm1vb2QuZGVzY3Ikc2UgPC0gbWVhbigocHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5ib290Lm1vb2QubWVyZ2UpKSRzZSwgbmEucm09VCkKYm9vdC5tb29kLmRlc2NyCgpgYGAKCiAKIyMjIyBTdG91ZmZlcidzIFRlc3R7LX0KCmBgYHtyfQoKbG9iby5tb29kX251bGwgPC0gcmYubnVsbF90ZXN0KGZvcmVzdC5sb2JvLm1vb2QsIGZvcmVzdC5ib290Lm1vb2QubWVyZ2UsIG1vZGVsX3R5cGU9IkxPQk8iLCBtZXRob2Q9ImFjdHVhbCIpCmxvYm8ubW9vZF9udWxsCmBgYAoKCgojIyMgTW9kZWwgMjogUGh5c2lvbG9neSB7LnRhYnNldH0KClRoZSBzZWNvbmQgbW9kZWwgSSB3aWxsIHRlc3QgaXMgd2hldGhlciB3ZSBjYW4gcHJlZGljdCB3ZWVrIHR5cGUgZnJvbSB0aGUgcGh5c2lvbG9neSBkYXRhIGFsb25lLiBGb3IgdGhpcyBtb2RlbCwgdGhlIExPQk8gZXJyb3IgcmF0ZSBpcyAzNi4xMSwgd2hpY2ggaXMgc3RpbGwgYmV0dGVyIHRoYW4gY2hhbmNlIGxldmVsIHByZWRpY3Rpb25zLCBidXQgd29yc2UgdGhhbiBtb2RlbCAxLgoKIyMjIyBNb2RlbCB7LX0KCmBgYHtyfQojIFRoZW4gd2l0aCB0aGUgZnVsbCBtb2RlbAojIHZhcnMuZm9yZXN0LnBoeXNpbyA8LSAgYygic2NfdG9uaWNfbWVhbiIsICJzY19waGFzaWNfbWFnIiwgInNjX3BoYXNpY19kdXIiLCAic2NfcGhhc2ljX2F1YyIsICJzY19waGFzaWNfbnVtIiwiaHJfbWVhbiIsICJocl9tYXgiLCAiaHJfbWluIiwgImhyX3NkIiwgImFjY19kZWx0YSIsICJ0ZW1wX21lYW4iKQojIGZvcmVzdC5sb2JvLnBoeXNpbyA8LSByZi5sb2JvKERhdGE9RU1BX0RhdGEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViTnI9ImNhc3Rvcl9yZWNvcmRfaWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2YXJzPXZhcnMuZm9yZXN0LnBoeXNpbywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dmFyPSJXZWVrX1R5cGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVHJlZT01MDAwKQphcy5kYXRhLmZyYW1lKGZvcmVzdC5sb2JvLnBoeXNpbyR0b3RhbCRzdWJqZWN0X2Vycm9ycykKcHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5sb2JvLnBoeXNpbyR0b3RhbCRzdWJqZWN0X2Vycm9ycykKCmBgYAoKIyMjIyBCb290c3RyYXB7LX0KV2UgYWdhaW4gZG8gdGhlIGJvb3RzdHJhcCBtb2RlbCwgYW5kIHRoZW4gc2F2ZSBpdCBhcyBhbiBvYmplY3QgZm9yIGxhdGVyIHVzZS4gCmBgYHtyfQojICMgTE9CTyBCb290c3RyYXBwaW5nCiMgeyBjbCA8LSBtYWtlQ2x1c3RlcihOb0NvcmVzLTEpCiMgICAgIHJlZ2lzdGVyRG9TTk9XKGNsKQojICAgICBpdGVyYXRpb25zIDwtIDEwMDAwCiMgICAgIHByaW50KCJSdW5uaW5nLCB0aGlzIHdpbGwgdGFrZSBhIHdoaWxlLi4uIiwgcXVvdGU9RikKIyAgICAgcGIgPC0gdHh0UHJvZ3Jlc3NCYXIobWF4ID0gaXRlcmF0aW9ucywgc3R5bGUgPSAzKQojICAgICBwcm9ncmVzcyA8LSBmdW5jdGlvbihuKSBzZXRUeHRQcm9ncmVzc0JhcihwYiwgbikKIyAgICAgb3B0cyA8LSBsaXN0KHByb2dyZXNzID0gcHJvZ3Jlc3MpCiMgICAgIGZvcmVzdC5ib290LnBoeXNpbyA8LSBmb3JlYWNoKGk9MTppdGVyYXRpb25zLCAub3B0aW9ucy5zbm93ID0gb3B0cyApICVkb3BhciUgewojICAgICAgICAgcmYuQm9vdHN0cmFwRXJyb3IoRGF0YT1FTUFfRGF0YSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaHVmZmxlPSJXZWVrX1R5cGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdGlvbnM9MSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0SWQ9ImNhc3Rvcl9yZWNvcmRfaWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2YXI9dmFycy5mb3Jlc3QucGh5c2lvLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl2YXI9IldlZWtfVHlwZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZXM9NTAwKQojICAgICB9CiMgICAgIHByaW50KCJEb25lISIsIHF1b3RlPUYpCiMgICAgIHN0b3BDbHVzdGVyKGNsKQojICAgICAKIyAgICAgIyBOb3cgbWVyZ2UgdGhlbSBpbnRvIG9uZSBkYXRhZnJhbWUKIyAgICAgcGIgPC0gdHh0UHJvZ3Jlc3NCYXIobWF4ID1sZW5ndGgoZm9yZXN0LmJvb3QucGh5c2lvKSwgc3R5bGUgPSAzKQojICAgICBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QuYm9vdC5waHlzaW9bWzFdXVsyXSkKIyAgICAgZm9yIChpIGluIDI6bGVuZ3RoKGZvcmVzdC5ib290LnBoeXNpbykpIHsKIyAgICAgICAgIHNldFR4dFByb2dyZXNzQmFyKHBiLCBpKQojICAgICAgICAgZGYuMm1lcmdlIDwtIGFzLmRhdGEuZnJhbWUoZm9yZXN0LmJvb3QucGh5c2lvW1tpXV1bMl0pCiMgICAgICAgICBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UgPC0gbWVyZ2UoZGYuMm1lcmdlLCBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UgLCBieT0iRGF0YUZyYW1lLmlkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcz1jKChwYXN0ZShpLCIueCIpKSwocGFzdGUoaSwiLnkiKSkpKQojICAgICB9CiMgICAgICMgTWVyZ2UgaXQgdG8gbWVhbgojICAgICBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UkYXZlcmFnZUVycm9yIDwtIHJvd01lYW5zKGZvcmVzdC5ib290LnBoeXNpby5tZXJnZSBbLCAtd2hpY2gobmFtZXMoIGZvcmVzdC5ib290LnBoeXNpby5tZXJnZSkgJWluJSBjKCJEYXRhRnJhbWUuaWQiKSldLCBuYS5ybT1UKQojICAgICBzYXZlUkRTKCBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UsIGZpbGUgPSAiZGF0YS9ib290c3RyYXBfcGh5c2lvLnJkcyIpCiMgfQpgYGAKCldlIG5vdyBjYWxjdWxhdGUgdGhlIGJvb3RzdHJhcCBTRSBhbmQgU0QKYGBge3J9CiMgUHJpbnQgdGhlIEVycm9ycwpib290LnBoeXNpby5kZXNjciA8LSBwc3ljaDo6ZGVzY3JpYmUoZm9yZXN0LmJvb3QucGh5c2lvLm1lcmdlJGF2ZXJhZ2VFcnJvcikKIyBBbHNvIGdldCB0aGUgdHJ1ZSBTRCBvZiBib290c3RyYXBzCmJvb3QucGh5c2lvLmRlc2NyJHNkIDwtIG1lYW4oKHBzeWNoOjpkZXNjcmliZShmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UpKSRzZCwgbmEucm09VCkKYm9vdC5waHlzaW8uZGVzY3Ikc2UgPC0gbWVhbigocHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5ib290LnBoeXNpby5tZXJnZSkpJHNlLCBuYS5ybT1UKQpib290LnBoeXNpby5kZXNjcgpgYGAKCiMjIyMgU3RvdWZmZXIncyBUZXN0ey19CgpTbyBub3cgdGhhdCBJIGhhdmUgdGhlIGF2ZXJhZ2VkIGJvb3RzdHJhcCBlcnJvciBmb3IgdGhlIHBoeXNpbyBtb2RlbCwgbGV0cyBjaGVjayBpZiB0aGUgTE9CTyBpcyBtb3JlIHRoYW4gcmFuZG9tIHdpdGggYSB0ZXN0IGFnYWluc3QgdGhlIGJvb3RzdHJhcCBlc3RpbWF0ZXMuIApgYGB7cn0KbG9iby5waHlzaW9fbnVsbCA8LSByZi5udWxsX3Rlc3QoZm9yZXN0LmxvYm8ucGh5c2lvLCBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UsICBtb2RlbF90eXBlPSJMT0JPIiwgbWV0aG9kPSJhY3R1YWwiKQpsb2JvLnBoeXNpb19udWxsCmBgYAoKQWNjb3JkaW5nIHRvIHRoZSB0LXRlc3QgYWdhaW5zdCB0aGUgYm9vdHN0cmFwIGVycm9yIHNhbXBsZSwgdGhlIHRlc3QgaXMgYWJvdmUgY2hhbmNlIGxldmVsIGhlcmUgdG9vLiBJIHdpbGwgYWdhaW4gZG8gYSBtb2RlbCBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIG1vZGVsLXRlc3Rpbmcgc2VjdGlvbnMuCgojIyMgTW9kZWwgMzogQ29tYmluZWQgey50YWJzZXR9CgpGaW5hbGx5IHdlIGNoZWNrIHRoZSBmdWxsIG1vZGVsIHVzaW5nIGJvdGggcGh5c2lvIGFuZCBtb29kIHZhcmlhYmxlcy4gVGhpcyBtb2RlbCBwZXJmcm9tcyBiZXR0ZXIgdGhhbiB0aGUgbW9vZCBtb2RlbC4gSXQgYWxzbyBwZXJmcm9tcyBiZXR0ZXIgdGhhbiBjaGFuY2UgZm9yIGVhY2ggc3ViamVjdCwgd2l0aCB0aGUgcG9vbGVkIGVmZmVjdCBiZWluZyBzaWduaWZpY2FudC4gCgojIyMjIE1vZGVsey19CmBgYHtyfQojIFRoZW4gd2l0aCB0aGUgZnVsbCBtb2RlbAojIHZhcnMuZm9yZXN0LnggPC0gIGMoIm1vb2RfcG9zaXRpdmVfYyIsICJtb29kX25lZ2F0aXZlX2MiLCAic2NfdG9uaWNfbWVhbiIsICJzY19waGFzaWNfbWFnIiwgInNjX3BoYXNpY19kdXIiLCAic2NfcGhhc2ljX2F1YyIsICJzY19waGFzaWNfbnVtIiwiaHJfbWVhbiIsICJocl9tYXgiLCAiaHJfbWluIiwgImhyX3NkIiwgInRlbXBfbWVhbiIpCiMgZm9yZXN0LmxvYm8uZnVsbCA8LSByZi5sb2JvKERhdGE9RU1BX0RhdGEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViTnI9ImNhc3Rvcl9yZWNvcmRfaWQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2YXJzPXZhcnMuZm9yZXN0LngsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXZhcj0iV2Vla19UeXBlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb1RyZWU9NTAwMCkKYXMuZGF0YS5mcmFtZShmb3Jlc3QubG9iby5mdWxsJHRvdGFsJHN1YmplY3RfZXJyb3JzKQpwc3ljaDo6ZGVzY3JpYmUoZm9yZXN0LmxvYm8uZnVsbCR0b3RhbCRzdWJqZWN0X2Vycm9ycykKCmBgYCAKCgojIyMjIEJvb3RzdHJhcHstfQpUaGVuIEkgY2FuIGNoZWNrIHRoZSBib290c3RyYXAgZXJyb3IgZm9yIHRoZSBtb2RlbCBjb21iaW5lZCBtb2RlbCBhcyBkb25lIGJlZm9yZToKYGBge3J9CiMge2NsIDwtIG1ha2VDbHVzdGVyKE5vQ29yZXMtMSkKIyByZWdpc3RlckRvU05PVyhjbCkKIyBpdGVyYXRpb25zIDwtIDEwMDAwCiMgcHJpbnQoIlJ1bm5pbmcsIHRoaXMgd2lsbCB0YWtlIGEgd2hpbGUuLi4iLCBxdW90ZT1GKQojIHBiIDwtIHR4dFByb2dyZXNzQmFyKG1heCA9IGl0ZXJhdGlvbnMsIHN0eWxlID0gMykKIyBwcm9ncmVzcyA8LSBmdW5jdGlvbihuKSBzZXRUeHRQcm9ncmVzc0JhcihwYiwgbikKIyBvcHRzIDwtIGxpc3QocHJvZ3Jlc3MgPSBwcm9ncmVzcykKIyBmb3Jlc3QuYm9vdC5jb21iaSA8LSBmb3JlYWNoKGk9MTppdGVyYXRpb25zLCAub3B0aW9ucy5zbm93ID0gb3B0cyApICVkb3BhciUgewojICAgICByZi5Cb290c3RyYXBFcnJvcihEYXRhPUVNQV9EYXRhLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2h1ZmZsZT0iV2Vla19UeXBlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdGlvbnM9MSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3RJZD0iY2FzdG9yX3JlY29yZF9pZCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dmFyPXZhcnMuZm9yZXN0LngsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dmFyPSJXZWVrX1R5cGUiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZXM9NTAwKQojIH0KIyBwcmludCgiRG9uZSEiLCBxdW90ZT1GKQojIHN0b3BDbHVzdGVyKGNsKQojIAojICMgTm93IG1lcmdlIHRoZW0gaW50byBvbmUgZGF0YWZyYW1lCiMgcGIgPC0gdHh0UHJvZ3Jlc3NCYXIobWF4ID1sZW5ndGgoZm9yZXN0LmJvb3QuY29tYmkpLCBzdHlsZSA9IDMpCiMgZm9yZXN0LmJvb3QuY29tYmkubWVyZ2UgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QuYm9vdC5waHlzaW9bWzFdXVsyXSkKIyBmb3IgKGkgaW4gMjpsZW5ndGgoZm9yZXN0LmJvb3QuY29tYmkpKSB7CiMgICAgIHNldFR4dFByb2dyZXNzQmFyKHBiLCBpKQojICAgICBkZi4ybWVyZ2UgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QuYm9vdC5jb21iaVtbaV1dWzJdKQojICAgICBmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSA8LSBtZXJnZShkZi4ybWVyZ2UsIGZvcmVzdC5ib290LmNvbWJpLm1lcmdlICwgYnk9IkRhdGFGcmFtZS5pZCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcz1jKChwYXN0ZShpLCIueCIpKSwocGFzdGUoaSwiLnkiKSkpKQojIH0KIyAjIE1lcmdlIGl0IHRvIG1lYW4KIyBmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSRhdmVyYWdlRXJyb3IgPC0gcm93TWVhbnMoZm9yZXN0LmJvb3QuY29tYmkubWVyZ2UgWywgLXdoaWNoKG5hbWVzKCBmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSkgJWluJSBjKCJEYXRhRnJhbWUuaWQiKSldLCBuYS5ybT1UKQojICBzYXZlUkRTKCBmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSwgZmlsZSA9ICJkYXRhL2Jvb3RzdHJhcF9jb21iaS5yZHMiKQojIH0KYGBgCgpXZSB0aGVuIGFnYWluIGNhbGN1bGF0ZSB0aGUgU0UgYW5kIFNEIG9mIHRoZSBtb2RlbHMKYGBge3J9CiMgUHJpbnQgdGhlIEVycm9ycwpib290LmNvbWJpLmRlc2NyIDwtIHBzeWNoOjpkZXNjcmliZShmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSRhdmVyYWdlRXJyb3IpCiMgQWxzbyBnZXQgdGhlIHRydWUgU0Qgb2YgYm9vdHN0cmFwcwpib290LmNvbWJpLmRlc2NyJHNkIDwtIG1lYW4oKHBzeWNoOjpkZXNjcmliZShmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSkpJHNkLCBuYS5ybT1UKQpib290LmNvbWJpLmRlc2NyJHNlIDwtIG1lYW4oKHBzeWNoOjpkZXNjcmliZShmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSkpJHNlLCBuYS5ybT1UKQpib290LmNvbWJpLmRlc2NyCgpgYGAKCiMjIyMgU3RvdWZmZXIncyBUZXN0ey19CkFuZCBmaW5hbGx5IEkgY2FuIHRlc3QgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZnVsbCBtb2RlbCBhbmQgdGhlIGJvb3RzdHJhcHBlZCBvbmUuIFNvIHdlIGNhbiBzZWUgYWdhaW4sIHRoYXQgb3VyIG1vZGVsIG9ubHkgaW1wcm92ZXMgc2xpZ2h0bHkgd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIHBoeXNpbyB2YXJpYWJsZXMgKDElKS4gVGhhdCBkb2VzbnQgc2VlbSBncmVhdC4gQnV0IHdlIGNhbiBhbHNvIGd1ZXNzIHRoYXQgd2l0aGluIHRoZSBjb250cm9sIHdlZWsgdGhlcmUgbWF5IGJlIHRpbWVzIHdoZW4gcGVvcGxlIGFyZSBzdHJlc3NlZCwgYW5kIHZpY2UgdmVyc2EgZm9yIHRoZSBzdHJlc3Mgd2Vlay5XZSB3aWxsIGRvIHRoZSBudWxsIHRlc3QgYWdhaW4uCgpgYGB7cn0KbG9iby5jb21iaV9udWxsIDwtIHJmLm51bGxfdGVzdChmb3Jlc3QubG9iby5mdWxsLCBmb3Jlc3QuYm9vdC5jb21iaS5tZXJnZSwgbW9kZWxfdHlwZT0iTE9CTyIsIG1ldGhvZD0iYWN0dWFsIikKbG9iby5jb21iaV9udWxsCmBgYAoKCgojIyMgV2hhdHMgdGhlIGJlc3QgTE9CTz8gey50YWJzZXR9CgpXZSBub3cgdGVzdCB0aGUgTE9CTyBtb2RlbHMgYWdhaW5zdCBlYWNoIG90aGVyLiBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IGVycm9yIHJhdGVzLCBhbmQgdGhhdCBpcyB0aGUgbW9vZCBhbmQgcGh5c2lvbG9neSBtb2RlbHMgKG1vZGVscyAxIGFuZCAyKS4gV2UgdGhlbiB0ZXN0IHRoZSBtb29kIGFnYWluc3QgdGhlIGNvbWJpbmVkIExPQk8gbW9kZWwsIEJhc2VkIG9uIHRoZXNlIHJlc3VsdHMsIHdlIHNlZSB0aGF0IE1vZGVsIDMgPiBNb2RlbCAxID4gTW9kZWwgMi4gCgojIyMjIE1vb2QgdnMgUGh5c2lvIHstfQpXZSBmaWx0ZXIgdGhlIGRhdGEgYW5kIGhhdmUgdG8gZG8gYSBjb3VwbGUgb2YgbWFuaXB1bGF0aW9ucyB0byBkbyBhIHBhaXJlZCB0LXRlc3QuV2Ugc2VlIHRoYXQgdGhlIG1vb2QgZG9lcyBzaWduaWZpY2FudGx5IGJldHRlcgpgYGB7cn0KCnJmLnJlc3VsdC5kZjEgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QubG9iby5waHlzaW8kdG90YWwkc3ViamVjdF9lcnJvcnMpCmNvbG5hbWVzKHJmLnJlc3VsdC5kZjEpWzFdIDwtICJwaHlzaW8iCnJmLnJlc3VsdC5kZjEkaWQgPC0gcm93bmFtZXMocmYucmVzdWx0LmRmMSkKCnJmLnJlc3VsdC5kZjIgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QubG9iby5tb29kJHRvdGFsJHN1YmplY3RfZXJyb3JzKQpjb2xuYW1lcyhyZi5yZXN1bHQuZGYyKVsxXSA8LSAibW9vZCIKcmYucmVzdWx0LmRmMiRpZCA8LSByb3duYW1lcyhyZi5yZXN1bHQuZGYyKQoKcmYucmVzdWx0Lm1lcmdlIDwtIG1lcmdlKHJmLnJlc3VsdC5kZjEsIHJmLnJlc3VsdC5kZjIsIGJ5PSJpZCIpCnRpZHkodC50ZXN0KHg9cmYucmVzdWx0Lm1lcmdlJHBoeXNpbywgeT1yZi5yZXN1bHQubWVyZ2UkbW9vZCwgcGFpcmVkPVQpKQpgYGAKCgojIyMjIENvbWJpIHZzIE1vb2Qgey19Ck5vdyBJIHRlc3QgdGhlIG1vb2QgdnMgZnVsbCBtb2RlbC4gSXQgYXBwZWFycyB0aGF0IHRoZSBmdWxsIG1vZGVsIGRvZXMgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIG9uZSB3aXRoIG1vb2Qgb25seS4gU28gaXQgaXMgc2FmZSB0byBzYXkgdGhhdCBNb2RlbCAzID4gTW9kZWwgMSA+IE1vZGVsIDIKYGBge3J9CgpyZi5yZXN1bHQuZGYxIDwtIGFzLmRhdGEuZnJhbWUoZm9yZXN0LmxvYm8uZnVsbCR0b3RhbCRzdWJqZWN0X2Vycm9ycykKY29sbmFtZXMocmYucmVzdWx0LmRmMSlbMV0gPC0gImZ1bGwiCnJmLnJlc3VsdC5kZjEkaWQgPC0gcm93bmFtZXMocmYucmVzdWx0LmRmMSkKCnJmLnJlc3VsdC5kZjIgPC0gYXMuZGF0YS5mcmFtZShmb3Jlc3QubG9iby5tb29kJHRvdGFsJHN1YmplY3RfZXJyb3JzKQpjb2xuYW1lcyhyZi5yZXN1bHQuZGYyKVsxXSA8LSAibW9vZCIKcmYucmVzdWx0LmRmMiRpZCA8LSByb3duYW1lcyhyZi5yZXN1bHQuZGYyKQoKcmYucmVzdWx0Lm1lcmdlIDwtIG1lcmdlKHJmLnJlc3VsdC5kZjEsIHJmLnJlc3VsdC5kZjIsIGJ5PSJpZCIpCnRpZHkodC50ZXN0KHg9cmYucmVzdWx0Lm1lcmdlJGZ1bGwsIHk9cmYucmVzdWx0Lm1lcmdlJG1vb2QsIHBhaXJlZD1UKSkKYGBgCgoKCgojIyBMT1NPCgpJbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgbW9kZWxzIGNhbiBiZSBnZW5lcmFsaXplZCBiZXlvbmQgdGhlIGluZGl2aWRpYWwsIHdlIHVzZSBhIHN0YW5kYXJkIExlYXZlLU9uZS1TdWJqZWN0LU91dCBhcHByb2FjaC4gSW4gdGhpcyBhbmFseXNpcywgd2UgcmVtb3ZlIGFuIGVudGlyZSBzdWJqZWN0cyBkYXRhIHNldCBmcm9tIHRoZSB0cmFpbmluZyBzZXQuIFdlIHRyYWluIG91ciBtb2RlbHMgb24gdGhlIHJlbWFpbmluZyBkYXRhLCBhbmQgdGhlbiB0ZXN0IHRoZSBjbGFzc2lmaWNhdGlvbiBlcnJvcnMgb24gdGhlIHN1YmplY3QgdGhhdCB3YXMgbGVmdCBvdXQuIFRoaXMgcHJvY2VzcyBpcyByZXBlYXRlZCB1bnRpbCBldmVyeSBzdWJqZWN0IGhhcyBiZWVuIHJlbW92ZWQgb25jZSwgdGh1cyBwcm92aWRpbmcgZXJyb3IgcmF0ZXMgZm9yIGVhY2ggc3ViamVjdC4gRm9yIGVhY2ggbW9kZWwsIHdlIHByZXNlbnQgdGhlIGVzdGltYXRlZCBMT1NPIGVycm9yIHJhdGVzLCBhbmQgdGhlIHRlc3QgYWdhaW5zdCB0aGUgcHJldmlvdXNseSBlc3RpbWF0ZWQgbnVsbCBkaXN0cmlidXRpb24uIAoKIyMjIE1vZGVsIDE6IE1vb2Qgey50YWJzZXR9CgojIyMjIE1vZGVsey19Ck91ciBmaXJzdCBtb2RlbCBsb29rcyBhdCB0aGUgbW9vZCByYXRpbmdzIHByZWRpY3Rpbmcgd2hpY2ggd2VlayBwYXJ0aWNpcGFudHMgYXJlIGluLiBJIGVzdGltYXRlIHRoZSBMT1NPIGVycm9yIHJhdGVzIGJlbG93LiBUaGUgbW9kZWwgaGVyZSBkb2VzbnQgZG8gYXMgd2VsbCBhcyB0aGUgbW9kZWwgd2l0aCB0aGUgbG9iby4gTGV0cyB0cnkgdG8gdXNlIHRoZSBMT0JPIG51bGwgZGlzdHJpYnV0aW9uIHRvIHNlZSBpZiBpdHMgYWJvdmUgY2hhbmNlIGxldmVscyBuZXh0LgpgYGB7cn0KIyBGaXJzdCB3aXRoIG1vb2QgaXRlbXMKIyB2YXJzLmZvcmVzdC5tb29kIDwtICBjKCJtb29kX3Bvc2l0aXZlIiwgIm1vb2RfbmVnYXRpdmUiKQojIGZvcmVzdC5sb3NvLm1vb2QgPC0gcmYubG9zbyhEYXRhPUVNQV9EYXRhLCAKIyAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk5yPSJjYXN0b3JfcmVjb3JkX2lkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICB4dmFycz12YXJzLmZvcmVzdC5tb29kLAojICAgICAgICAgICAgICAgICAgICAgICAgeXZhcj0iV2Vla19UeXBlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgIE5vVHJlZT01MDAwKQphcy5kYXRhLmZyYW1lKGZvcmVzdC5sb3NvLm1vb2QkZXJyb3JfcmF0ZSkKcHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5sb3NvLm1vb2QkZXJyb3JfcmF0ZSoxMDAsIG5hLnJtPVQpCgpgYGAKCiMjIyMgVGVzdCB7LX0KSGVyZSBJIHdpbGwgdHJ5IHRvIGNoZWNrIHRoZSBMT1NPIG1vZGVsIHZzLiB0aGUgbnVsbCBkaXN0cmlidXRpb24gZXN0aW1hdGVkIGZyb20gdGhlIGJvb3RzdHJhcCB3ZSBkaWQgZWFybGVyLiBUaGUgbG9zbyBtb2RlbCBkaWQgbm90IHBlcmZvcm0gYmV0dGVyIHRoYW4gdGhlIGJvb3RzdHJhcHBlZCBlc3RpbWF0ZXMuCmBgYHtyfQoKZm9yZXN0Lmxvc29fbW9vZF9udWxsIDwtIHJmLm51bGxfdGVzdChmb3Jlc3QubG9zby5tb29kLCBmb3Jlc3QuYm9vdC5tb29kLm1lcmdlLCAgbW9kZWxfdHlwZT0iTE9TTyIsIG1ldGhvZD0iYWN0dWFsIikKZm9yZXN0Lmxvc29fbW9vZF9udWxsCgpgYGAKCgojIyMgTW9kZWwgMjogUGh5c2lvbG9neSB7LnRhYnNldH0KClRoZSBzZWNvbmQgbW9kZWwgaXMgbG9va2luZyBhdCB0aGUgcGh5c2lvIHZhcmlhYmxlcyBwcmVkaWN0aW5nIHdlZWsgdHlwZS4gV2Ugc2VlIHRoYXQgaXQgb25seSBhY2hpZXZlcyA0Ny44MyUgc3VjY2Vzcy4gV2Ugd2lsbCB0ZXN0IHRoaXMgbm93IGFnYWluc3QgdGhlIGJvb3RzdHJhcHBlZCBlcnJvciByYXRlLgojIyMjIE1vZGVsey19CmBgYHtyfQojIFRoZW4gd2l0aCB0aGUgZnVsbCBtb2RlbAojIHZhcnMuZm9yZXN0LnBoeXNpbyA8LSAgYygic2NfdG9uaWNfbWVhbiIsICJzY19waGFzaWNfbWFnIiwgInNjX3BoYXNpY19kdXIiLCAic2NfcGhhc2ljX2F1YyIsICJzY19waGFzaWNfbnVtIiwiaHJfbWVhbiIsICJocl9tYXgiLCAiaHJfbWluIiwgImhyX3NkIiwgImFjY19kZWx0YSIsICJ0ZW1wX21lYW4iKQojIGZvcmVzdC5sb3NvLnBoeXNpbyA8LSByZi5sb3NvKERhdGE9RU1BX0RhdGEsIAojICAgICAgICAgICAgICAgICAgICAgICAgU3ViTnI9ImNhc3Rvcl9yZWNvcmRfaWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgIHh2YXJzPXZhcnMuZm9yZXN0LnBoeXNpbywKIyAgICAgICAgICAgICAgICAgICAgICAgIHl2YXI9IldlZWtfVHlwZSIsCiMgICAgICAgICAgICAgICAgICAgICAgICBOb1RyZWU9NTAwMCkKYXMuZGF0YS5mcmFtZShmb3Jlc3QubG9zby5waHlzaW8kZXJyb3JfcmF0ZSkKcHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5sb3NvLnBoeXNpbyRlcnJvcl9yYXRlKjEwMCkKYGBgIAoKIyMjIyBUZXN0ey19Ck5leHQgd2UgY2hlY2sgdGhlIHBoeXNpbyB2YXJpYWJsZXMgYWdhaW5zdCB0aGUgbnVsbCBkaXN0cmlidXRpb24uIEhlcmUgd2Ugc2VlIHRoYXQgaXQgaXRzIGFsc28gbm90IHNpZ25maWNhbnRseSBiZXR0ZXIgdGhhbiBjaGFuY2UuCmBgYHtyfQpmb3Jlc3QubG9zb19waHlzaW9fbnVsbCA8LSByZi5udWxsX3Rlc3QoZm9yZXN0Lmxvc28ucGh5c2lvLCBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UsIG1vZGVsX3R5cGU9IkxPU08iLCBtZXRob2Q9ImFjdHVhbCIpCmZvcmVzdC5sb3NvX3BoeXNpb19udWxsCmBgYAoKIyMjIE1vZGVsIDM6IENvbWJpbmVkIHsudGFic2V0fQpGSW5hbGx5LCB0aGUgdGhpcmQgbW9kZWwgbG9va3MgYXQgZXZlcnl0aGluZyAoaS5lLiBib3RoIHBoeXNpbyBhbmQgbW9vZCkuIFRoaXMgaGFzIGFuIGVycm9yIHJhdGUgb2YgNDMlIHdoaWNoIHN0aWxsIHN1Y2tzLiBMZXRzIHRlc3QgdGhpcyBuZXh0IGFnYWluc3QgdGhlIGJvb3RzdHJhcCBlcnJvcgoKIyMjIyBNb2RlbCB7LX0KYGBge3J9CiMgVGhlbiB3aXRoIHRoZSBmdWxsIG1vZGVsCiMgdmFycy5mb3Jlc3QueCA8LSAgYygibW9vZF9wb3NpdGl2ZV9jIiwgIm1vb2RfbmVnYXRpdmVfYyIsICAic2NfdG9uaWNfbWVhbiIsICJzY19waGFzaWNfbWFnIiwgInNjX3BoYXNpY19kdXIiLCAic2NfcGhhc2ljX2F1YyIsICJzY19waGFzaWNfbnVtIiwiaHJfbWVhbiIsICJocl9tYXgiLCAiaHJfbWluIiwgImhyX3NkIiwgImFjY19kZWx0YSIsICJ0ZW1wX21lYW4iKQojIGZvcmVzdC5sb3NvLmZ1bGwgPC0gcmYubG9zbyhEYXRhPUVNQV9EYXRhLCAKIyAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk5yPSJjYXN0b3JfcmVjb3JkX2lkIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICB4dmFycz12YXJzLmZvcmVzdC54LAojICAgICAgICAgICAgICAgICAgICAgICAgeXZhcj0iV2Vla19UeXBlIiwKIyAgICAgICAgICAgICAgICAgICAgICAgIE5vVHJlZT01MDAwKQphcy5kYXRhLmZyYW1lKGZvcmVzdC5sb3NvLmZ1bGwkZXJyb3JfcmF0ZSkKcHN5Y2g6OmRlc2NyaWJlKGZvcmVzdC5sb3NvLmZ1bGwkZXJyb3JfcmF0ZSoxMDApCgpgYGAgCiMjIyMgVGVzdCB7LX0KRmluYWxseSB3ZSB0ZXN0IHRoZSBtb2RlbCB3aXRoIGJvdGggYWdhaW5zdCB0aGUgbnVsbCBkaXN0cmlidXRpb24uVGhpcyBvbmUgaXMgYWxzbyBub3Qgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiBjaGFuY2UuICAKYGBge3J9CmZvcmVzdC5sb3NvX2Z1bGxfbnVsbCA8LSByZi5udWxsX3Rlc3QoZm9yZXN0Lmxvc28uZnVsbCwgZm9yZXN0LmJvb3QuY29tYmkubWVyZ2UsIG1vZGVsX3R5cGU9IkxPU08iLCBtZXRob2Q9ImFjdHVhbCIpCmZvcmVzdC5sb3NvX2Z1bGxfbnVsbAoKYGBgCgpCYXNlZCBvbiBhbGwgdGhyZWUgdGVzdHMgZm9yIHRoZSBtb2RlbHMgYWdhaW5zdCB0aGUgbnVsbCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGUgTE9TTyBtb2RlbHMgZG8gbm90IGluIGZhY3QgcGVyZm9ybSBiZXR0ZXIgdGhhbiBjaGFuY2UuIAoKIyMjIFdoYXRzIHRoZSBiZXN0IExPU08/IHstfQoKQmFzZWQgb24gdGhlIGVycm9yIHJhdGUsIGxldHMgc2VlIGlmIG9uZSBtb2RlbCBkb2VzIGEgYmV0dGVyIGpvYiB0aGFuIHRoZSBvdGhlcjoKYGBge3J9CnJmLmxvc28ubW9vZCA8LSBhcy5kYXRhLmZyYW1lKGZvcmVzdC5sb3NvLm1vb2QkZXJyb3JfcmF0ZSkKcmYubG9zby5tb29kJGlkIDwtIHJvd25hbWVzKHJmLmxvc28ubW9vZCkKCnJmLmxvc28ucGh5c2lvIDwtIGFzLmRhdGEuZnJhbWUoZm9yZXN0Lmxvc28ucGh5c2lvJGVycm9yX3JhdGUpCnJmLmxvc28ucGh5c2lvJGlkIDwtIHJvd25hbWVzKHJmLmxvc28ucGh5c2lvKQoKcmYubG9zby5mdWxsIDwtIGFzLmRhdGEuZnJhbWUoZm9yZXN0Lmxvc28uZnVsbCRlcnJvcl9yYXRlKQpyZi5sb3NvLmZ1bGwkaWQgPC0gcm93bmFtZXMocmYubG9zby5mdWxsKQoKcmYucmVzdWx0Lm1lcmdlIDwtIG1lcmdlKHJmLmxvc28ubW9vZCwgcmYubG9zby5waHlzaW8sIGJ5PSJpZCIpCnJmLnJlc3VsdC5tZXJnZSA8LSBtZXJnZShyZi5yZXN1bHQubWVyZ2UsIHJmLmxvc28uZnVsbCwgYnk9ImlkIikKYGBgCgoKYGBge3J9CnRpZHkodC50ZXN0KHg9cmYucmVzdWx0Lm1lcmdlJGBmb3Jlc3QubG9zby5tb29kJGVycm9yX3JhdGVgLCB5PXJmLnJlc3VsdC5tZXJnZSRgZm9yZXN0Lmxvc28ucGh5c2lvJGVycm9yX3JhdGVgLCBwYWlyZWQ9VCkpCnRpZHkodC50ZXN0KHg9cmYucmVzdWx0Lm1lcmdlJGBmb3Jlc3QubG9zby5tb29kJGVycm9yX3JhdGVgLCB5PXJmLnJlc3VsdC5tZXJnZSRgZm9yZXN0Lmxvc28uZnVsbCRlcnJvcl9yYXRlYCwgcGFpcmVkPVQpKQp0aWR5KHQudGVzdCh4PXJmLnJlc3VsdC5tZXJnZSRgZm9yZXN0Lmxvc28ucGh5c2lvJGVycm9yX3JhdGVgLCB5PXJmLnJlc3VsdC5tZXJnZSRgZm9yZXN0Lmxvc28uZnVsbCRlcnJvcl9yYXRlYCwgcGFpcmVkPVQpKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlcnJvciByYXRlcyBpbiB0aGUgcGFpcmVkIHNhbXBsZSB0LXRlc3QgaW4gdGhlc2UgdGhyZWUgbW9kZWxzLiBXaGF0IGNvdWxkIHRoaXMgbWVhbj8gVGhhdCByZWdhcmRsZXNzIG9mIHdoYXQgbW9kZWwgd2UgdXNlIGF0IGEgcG9wdWxhdGlvbiBsZXZlbCwgd2Ugc3RpbGwgYXJlIG5vdCBhYmxlIHRvIG1ha2UgZGVjZW50IHByZWRpY3Rpb25zLiBJIHRoaW5rIHRoYXQgdGhlc2UgbW9kZWxzIGFyZW50IGdvb2QgYXQgcG9wdWxhdGlvbiBsZXZlbCBwcmVkaWN0aW9ucywgYW5kIHRoaXMgaXMgcHJldHR5IG9ibnZpb3VzIGlmIHdlIGxvb2sgYXQgdGhlIHdpdGhpbi1zdWJqZWN0IHZhcmlhbmNlIGZyb20gb3VyIGxpbmVhciBtb2RlbHMuIE1vc3Qgb2YgdGhlIHZhcmlhbmNlIGNvbWVzIGZyb20gYmV0d2VlbiBzdWJqZWN0cy4gQW5vdGhlciBhcHByb2FjaCBpcyB3YXJyYW50ZWQuCgoKIyMgUGxvdCBvZiBNb2RlbHMKCldlIG5leHQgd2FodCB0byBtYWtlIGEgcGxvdCBvZiBteSBtb2RlbHMgd2l0aCB0aGUgc3RhbmRhcmQgZXJyb3IuIFdlIGZpcnN0IG1lcmdlIHRoZW0gaW50byBvbmUgZGF0YWZyYW1lLCB0aGVuIHdlIGNhbiBhY3R1YWxseSBwbG90IHRoZW0uIApgYGB7cn0KCiMgSSB3aWxsIHJlbmFtZSB0aGUgYm9vdHN0cmFwIGNvbG91bW5zIHNvIEkgY2FuIGFkZCB0aGVtIHRvIHRoZSBmdWxsIG1vZGVsIGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKZGZfYm9vdDEgPC0gZm9yZXN0LmJvb3QubW9vZC5tZXJnZVssYygiRGF0YUZyYW1lLmlkIiAsImF2ZXJhZ2VFcnJvciIpXQpkZl9ib290MSA8LSBkZl9ib290MSAlPiUgZHBseXI6OnJlbmFtZShpZD1EYXRhRnJhbWUuaWQsIGVycm9yPWF2ZXJhZ2VFcnJvcikgCmRmX2Jvb3QxIDwtIHRpYmJsZTo6YWRkX2NvbHVtbihkZl9ib290MSwgbW9kZWw9ImJvb3QubW9vZCIsIC5hZnRlcj0iaWQiKQpkZl9ib290MiA8LSBmb3Jlc3QuYm9vdC5waHlzaW8ubWVyZ2UgJT4lIGRwbHlyOjpzZWxlY3QoRGF0YUZyYW1lLmlkLCBhdmVyYWdlRXJyb3IpICU+JSBkcGx5cjo6cmVuYW1lKGlkPURhdGFGcmFtZS5pZCwgZXJyb3I9YXZlcmFnZUVycm9yKSAKZGZfYm9vdDIgPC0gdGliYmxlOjphZGRfY29sdW1uKGRmX2Jvb3QyLCBtb2RlbD0iYm9vdC5waHlzaW8iLCAuYWZ0ZXI9ImlkIikKZGZfYm9vdDMgPC0gZm9yZXN0LmJvb3QuY29tYmkubWVyZ2UgJT4lIGRwbHlyOjpzZWxlY3QoRGF0YUZyYW1lLmlkLCBhdmVyYWdlRXJyb3IpICU+JSBkcGx5cjo6cmVuYW1lKGlkPURhdGFGcmFtZS5pZCwgZXJyb3I9YXZlcmFnZUVycm9yKSAKZGZfYm9vdDMgPC0gdGliYmxlOjphZGRfY29sdW1uKGRmX2Jvb3QzLCBtb2RlbD0iYm9vdC5mdWxsIiwgLmFmdGVyPSJpZCIpCiMgSm9pbiB0aGUgYm9vdCBzdHJhcHMKZGZfYm9vdCA8LSBmdWxsX2pvaW4oZGZfYm9vdDEsIGRmX2Jvb3QyKSAKZGZfYm9vdCA8LSBmdWxsX2pvaW4oZGZfYm9vdCwgZGZfYm9vdDMpCiMgTWFrZSB0aGUgcmVzdWx0cyBhbmQgbWVyZ2UgYm9vdApkZl9sb28gPC0gZ2F0aGVyKHJmLmNvbWJpbmVkLmVycm9ycyxtb2RlbCwgZXJyb3IsIGxvc28ubW9vZDpsb2JvLmZ1bGwsIGZhY3Rvcl9rZXk9VFJVRSkKZGZfbG9vIDwtIGZ1bGxfam9pbihkZl9sb28sIGRmX2Jvb3QpCiMgU2VwYXJhdGUgY29sb3VtbnMgZm9yIHBsb3R0aW5nCmRmX2xvbyA8LSBzZXBhcmF0ZShkZl9sb28sIG1vZGVsLCBpbnRvPWMoIk1ldGhvZCIsICJNb2RlbCIpKQoKCgpkZl9sb29fc3VtIDwtIGRhdGFfc3VtbWFyeShkZl9sb28sICJlcnJvciIsIGMoIk1ldGhvZCIsICJNb2RlbCIpKQojIFNldCB0aGUgU0QgYW5kIFNFIG9mIGJvb3RzdHJhcCBtb2RlbHMgdG8gdGhlIGNvcnJlY3Qgb25lcyBvZiB3aG9sZSBtb2RlbApkZl9sb29fc3VtJHNkW2RmX2xvb19zdW0kTWV0aG9kPT0iYm9vdCIgJiBkZl9sb29fc3VtJE1vZGVsPT0ibW9vZCJdIDwtIGJvb3QubW9vZC5kZXNjciRzZApkZl9sb29fc3VtJHNlW2RmX2xvb19zdW0kTWV0aG9kPT0iYm9vdCIgJiBkZl9sb29fc3VtJE1vZGVsPT0ibW9vZCJdIDwtIGJvb3QubW9vZC5kZXNjciRzZQpkZl9sb29fc3VtJHNkW2RmX2xvb19zdW0kTWV0aG9kPT0iYm9vdCIgJiBkZl9sb29fc3VtJE1vZGVsPT0icGh5c2lvIl0gPC0gYm9vdC5waHlzaW8uZGVzY3Ikc2QKZGZfbG9vX3N1bSRzZVtkZl9sb29fc3VtJE1ldGhvZD09ImJvb3QiICYgZGZfbG9vX3N1bSRNb2RlbD09InBoeXNpbyJdIDwtIGJvb3QucGh5c2lvLmRlc2NyJHNlCmRmX2xvb19zdW0kc2RbZGZfbG9vX3N1bSRNZXRob2Q9PSJib290IiAmIGRmX2xvb19zdW0kTW9kZWw9PSJmdWxsIl0gPC0gYm9vdC5jb21iaS5kZXNjciRzZApkZl9sb29fc3VtJHNlW2RmX2xvb19zdW0kTWV0aG9kPT0iYm9vdCIgJiBkZl9sb29fc3VtJE1vZGVsPT0iZnVsbCJdIDwtIGJvb3QuY29tYmkuZGVzY3Ikc2UKCiMgU2V0IHRoZSBmYWN0b3IgdG8gbWFrZSBpdCBwcmV0dHkKZGZfbG9vX3N1bSRNZXRob2QgPC0gZmFjdG9yKGRmX2xvb19zdW0kTWV0aG9kLCBsZXZlbHMgPWMoImxvYm8iLCAibG9zbyIsICJib290IiksIGxhYmVscyA9IGMoIkxPQk8iLCAiTE9TTyIsICJCb290c3RyYXAiKSkKZGZfbG9vX3N1bSRNb2RlbDwtIGZhY3RvcihkZl9sb29fc3VtJE1vZGVsLCBsZXZlbHMgPWMoIm1vb2QiLCAicGh5c2lvIiwgImZ1bGwiKSwgbGFiZWxzID0gYygiTW9kZWwgMTpcbk1vb2QiLCAiTW9kZWwgMjpcbiBQaHlzaW9sb2d5IiwgIk1vZGVsIDM6XG5Db21iaW5hdGlvbiIpKQoKZmlndXJlLmxvbyA8LSBnZ3Bsb3QoZGZfbG9vX3N1bSwgYWVzKHg9TW9kZWwsIHk9ZXJyb3IsIGNvbG91cj1NZXRob2QsIGZpbGw9TWV0aG9kKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKCkpICsgCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWVycm9yLXNlLCB5bWF4PWVycm9yK3NlKSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgY29sb3VyPSJibGFjayIpICArIAogICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsMTAsMjAsMzAsNDAsNTAsIDYwLCA3MCwgODApLCBtaW5vcl9icmVha3M9Yyg1LDE1LDI1LDM1LDQ1LDU1LDY1LDc1LCA4NSkgKSsgCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGU9IlNldDIiKSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNldDIiKSArIAogICAgeGxhYigiIikrIHlsYWIoIkVycm9yIFJhdGUgKCUpXG4iKSArIAogICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNiwgIGZhbWlseT0iQ2FsaWJyaSIpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMSwgY29sb3VyID0gImdyZXkiKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyPSJncmV5OTUiKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXk5NSIpKTsgCmdnc2F2ZSgiZmlndXJlcy9maWdfUkZNb2RlbHMudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTQsIGhlaWdodD00LCBkcGk9MzAwLCBjb21wcmVzc2lvbiA9ICdsencnKQpmaWd1cmUubG9vCmBgYAoKIyMgVGVzdGluZyBBbGwgTW9kZWxzCgpOb3cgd2Ugd2FudCB0byBzZWUgZm9yIGVhY2ggb2YgdGhlIG1vZGVscywgd2hpY2ggb25lIHBlcmZvcm1zIGJlc3QuIEkgZmlyc3QgbmVlZCB0byBzcGxpdCB0aGUgbG9uZyBkYXRhZnJhbWUgSSBtYWRlIGZvciB0aGUgZmlndXJlcyBpbnRvIGEgd2lkZSBmb3JtYXQuCmBgYHtyfQpkZl9sb29fd2lkZSA8LSBwaXZvdF93aWRlcihkZl9sb28saWRfY29scyA9IGlkLCBuYW1lc19mcm9tPWMoTWV0aG9kLCBNb2RlbCksIHZhbHVlc19mcm9tPWVycm9yKQpwcmludChkZl9sb29fd2lkZSkKI3dyaXRlX2NzdihkZl9sb29fd2lkZSwgZmlsZSA9ICJkYXRhL0xPT19ERi5jc3YiKQpgYGAKCgojIyMgTW9kZWwgMTogTW9vZCB7LnRhYnNldH0KCiMjIyMgTE9CTyB2cyBCb290IHstfQpgYGB7cn0KdGlkeSh0LnRlc3QoZGZfbG9vX3dpZGUkbG9ib19tb29kLCBkZl9sb29fd2lkZSRib290X21vb2QgLCBwYWlyZWQgPSBUKSkKCmBgYAoKIyMjIyBMT1NPIHZzIEJvb3Qgey19CgpgYGB7cn0KdGlkeSh0LnRlc3QoZGZfbG9vX3dpZGUkbG9zb19tb29kLCBkZl9sb29fd2lkZSRib290X21vb2QgLCBwYWlyZWQgPSBUKSkKCmBgYAoKIyMjIyBMT0JPICB2cyBMT1NPIHstfQpgYGB7cn0KCnRpZHkodC50ZXN0KGRmX2xvb193aWRlJGxvYm9fbW9vZCwgZGZfbG9vX3dpZGUkbG9zb19tb29kICwgcGFpcmVkID0gVCkpCmBgYAoKCiMjIyBNb2RlbCAyOiBQaHlzaW8gey50YWJzZXR9CgojIyMjIExPQk8gdnMgQm9vdCB7LX0KYGBge3J9Cgp0aWR5KHQudGVzdChkZl9sb29fd2lkZSRsb2JvX3BoeXNpbywgZGZfbG9vX3dpZGUkYm9vdF9waHlzaW8gLCBwYWlyZWQgPSBUKSkKCmBgYAoKIyMjIyBMT1NPIHZzIEJvb3Qgey19CgpgYGB7cn0KCnRpZHkodC50ZXN0KGRmX2xvb193aWRlJGxvc29fcGh5c2lvLCBkZl9sb29fd2lkZSRib290X3BoeXNpbyAsIHBhaXJlZCA9IFQpKQoKYGBgCgoKIyMjIyBMT0JPICB2cyBMT1NPIHstfQpgYGB7cn0KCnRpZHkodC50ZXN0KGRmX2xvb193aWRlJGxvYm9fcGh5c2lvLCBkZl9sb29fd2lkZSRsb3NvX3BoeXNpbyAsIHBhaXJlZCA9IFQpKQoKYGBgCgoKCiMjIyBNb2RlbCAzOiBGdWxsIE1vZGVsIHsudGFic2V0fQoKIyMjIyBMT0JPIHZzIEJvb3Qgey19CmBgYHtyfQoKdGlkeSh0LnRlc3QoZGZfbG9vX3dpZGUkbG9ib19mdWxsLCBkZl9sb29fd2lkZSRib290X2Z1bGwgLCBwYWlyZWQgPSBUKSkKCmBgYAoKIyMjIyBMT1NPIHZzIEJvb3Qgey19CgpgYGB7cn0KCnRpZHkodC50ZXN0KGRmX2xvb193aWRlJGxvc29fZnVsbCwgZGZfbG9vX3dpZGUkYm9vdF9mdWxsICwgcGFpcmVkID0gVCkpCgpgYGAKCgojIyMjIExPQk8gIHZzIExPU08gey19CmBgYHtyfQoKdGlkeSh0LnRlc3QoZGZfbG9vX3dpZGUkbG9ib19mdWxsLCBkZl9sb29fd2lkZSRsb3NvX2Z1bGwgLCBwYWlyZWQgPSBUKSkKCmBgYAoKIyBTeXN0ZW0gSW5mbwpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCgoK